Bash - непрерывная обработка строк

Микроядра требуют, чтобы меньше кода было выполнено в самом внутреннем, пользующемся наибольшим доверием режиме, чем монолитные ядра. Это имеет много аспектов, таких как:

  • Микроядра позволяют нефундаментальные функции (такие как драйверы для аппаратных средств, которые не подключены или не используемые) быть загруженным и разгруженным по желанию. Это главным образом достижимо на Linux через модули.
  • Микроядра более устойчивы: если компонент неядра откажет, то он не возьмет целую систему с ним. Ошибочная файловая система или драйвер устройства могут разрушить систему Linux. Linux не имеет никакого способа смягчить эти проблемы кроме кодирования методов и тестирования.
  • Микроядра имеют меньшую достоверную вычислительную базу. Таким образом, даже злонамеренный драйвер устройства или файловая система не могут взять под свой контроль целую систему (например, драйвер сомнительного источника для Вашего последнего гаджета USB не смог бы считать Ваш жесткий диск).
  • Последствие предыдущей точки - то, что обычные пользователи могут загрузить свои собственные компоненты, которые были бы компонентами ядра в монолитном ядре.

Графический интерфейсы пользователя Unix предоставлены через X-окно, которое является кодом пространства пользователя (за исключением (часть) драйвер видеоустройства). Много современных нельдов позволяют обычным пользователям загружать драйверы файловой системы через FUSE. Часть фильтрации сетевого пакета Linux может быть сделана в пространстве пользователя. Однако драйверы устройств, планировщики, диспетчеры памяти и большинство сетевых протоколов все еще только для ядра.

Классик (если датированный) чтение о Linux и микроядрах является дебатами Tanenbaum–Torvalds. Двадцать лет спустя можно было сказать, что Linux очень очень медленно двигает структуру микроядра (загружаемые модули появились вначале, FUSE более свеж), но существует все еще длинный путь для движения.

Другой вещью, которая изменилась, является увеличенная уместность виртуализации на настольных и высокопроизводительных встроенных компьютерах: в некоторых целях соответствующее различие не между ядром и пространством пользователя, а между гипервизором и гостевыми Ose.

10
08.11.2011, 15:32
7 ответов

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"
12
27.01.2020, 19:59
  • 1
    Так как эти две строки довольно interchangable, это решение является до сих пор самым опрятным... Если строки не interchangable sed будет определенно необходим я предполагаю. –  gsklee 09.11.2011, 00:21

Вы не можете вложить расширения в ударе (ни в 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}
10
27.01.2020, 19:59

Вы могли использовать сингл sed управляйте как в следующем:

FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")
3
27.01.2020, 19:59

Слияние sed, это должно добиться цели:

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"

(Это точно не отвечает на Ваш вопрос, потому что я не могу; не уверенный, если это возможно.)

2
27.01.2020, 19:59

Bash ${} работа конструкций с именами переменной, таким образом, нет никакого способа встроить команду непосредственно. подход _ @sr является альтернативой, если Вы не возражаете против дополнительного ветвления.

1
27.01.2020, 19:59

Строка

FILE=$(basename "${1/%.jpeg/.jpg}")

может быть сокращен и сделан более портативным с

FILE=$(basename "${1%.jpeg}.jpg")
1
27.01.2020, 19:59

Я пошел бы для:

FILE=$(basename $1 .jpeg).jpg

Второй параметр к базовому имени является суффиксом, который будет удален из имени файла (см. man basename)

4
27.01.2020, 19:59

Теги

Похожие вопросы