Микроядра требуют, чтобы меньше кода было выполнено в самом внутреннем, пользующемся наибольшим доверием режиме, чем монолитные ядра. Это имеет много аспектов, таких как:
Графический интерфейсы пользователя Unix предоставлены через X-окно, которое является кодом пространства пользователя (за исключением (часть) драйвер видеоустройства). Много современных нельдов позволяют обычным пользователям загружать драйверы файловой системы через FUSE. Часть фильтрации сетевого пакета Linux может быть сделана в пространстве пользователя. Однако драйверы устройств, планировщики, диспетчеры памяти и большинство сетевых протоколов все еще только для ядра.
Классик (если датированный) чтение о Linux и микроядрах является дебатами Tanenbaum–Torvalds. Двадцать лет спустя можно было сказать, что Linux очень очень медленно двигает структуру микроядра (загружаемые модули появились вначале, FUSE более свеж), но существует все еще длинный путь для движения.
Другой вещью, которая изменилась, является увеличенная уместность виртуализации на настольных и высокопроизводительных встроенных компьютерах: в некоторых целях соответствующее различие не между ядром и пространством пользователя, а между гипервизором и гостевыми Ose.
FILE=$(basename "${1/%.jpeg/.jpg}")
работавший для меня.
тест:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
содержание сценария:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
Вы не можете вложить расширения в ударе (ни в ksh, пепле и других оболочках кроме zsh). Это - только косметическое ограничение, с тех пор поскольку Вы иллюстрируете, что можно присвоить промежуточное выражение временной переменной. Это - немного раздражения для острот, но в сценариях это возможно лучше для удобочитаемости.
Вы могли избегать использования внешней утилиты basename
и используйте конструкцию обработки строк вместо этого:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Здесь, это происходит, что можно переписать сценарий для помещения замены команды относительно внешней стороны. Это не общее явление, и при этом Вы ничего не получаете кроме определенного чувства остроты.
Zsh, для лучше или для худшего, действительно позволяет Вам расширения вложенного множества:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Или Вы могли использовать встроенную конструкцию zsh вместо basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Вы могли использовать сингл sed
управляйте как в следующем:
FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")
Слияние sed
, это должно добиться цели:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(Это точно не отвечает на Ваш вопрос, потому что я не могу; не уверенный, если это возможно.)
Bash ${}
работа конструкций с именами переменной, таким образом, нет никакого способа встроить команду непосредственно. подход _ @sr является альтернативой, если Вы не возражаете против дополнительного ветвления.
Строка
FILE=$(basename "${1/%.jpeg/.jpg}")
может быть сокращен и сделан более портативным с
FILE=$(basename "${1%.jpeg}.jpg")
Я пошел бы для:
FILE=$(basename $1 .jpeg).jpg
Второй параметр к базовому имени является суффиксом, который будет удален из имени файла (см. man basename
)
sed
будет определенно необходим я предполагаю. – gsklee 09.11.2011, 00:21