Какие шаблоны можно использовать в расширении параметров zsh?

Ленивое размонтирование создает скакуна Кота Шрёдингера
  • Вы не можете знать, действительно ли устройство размонтировано или нет
  • "Размонтированная" файловая система остается доступной при некоторых обстоятельствах
  • «Размонтированная» файловая система недоступна при некоторых обстоятельствах

Существует ложное чувство безопасности:кажется, что файловая система была размонтирована, но на самом деле она была только скрыта от пространства имен файлов/иерархии.

  • Процессы по-прежнему могут записывать через дескрипторы открытых файлов
  • Новые или существующие файлы могут быть открыты для записи процессами с рабочим каталогом внутри точки монтирования через относительные пути

Это означает, что если вы umount -l /media/hddу вас больше не будет доступа к/media/hdd/dir/file(абсолютному имени пути ), но если у вас есть процесс с рабочим каталогом /media/hdd, он по-прежнему сможет создавать новые процессы, которые могут чтение/запись./dir/file(относительный путь ).

Если вы попытаетесь размонтировать устройство, вы получите запутанное сообщение:

# umount --force --all-targets /dev/sdb2
umount: /dev/sdb2: not mounted

Это создает впечатление, что устройство не указано, но там по-прежнему могут выполняться процессы записи на диск.

Поскольку существуют различные неочевидные -ситуации, которые могут привести к блокировке umount , файловая система все равно может не размонтироваться, даже если lsof +f -- /dev/deviceничего не показывает.

Вы никогда не узнаете, размонтирована ли файловая система на самом деле. Нет никакого способа узнать.

Съемные устройства

Если вы делаете umount -lсъемный диск, вы находитесь в подвешенном состоянии, -земля, :вы не можете быть уверены, что все ожидающие данные были записаны на диск.

Лучшее, что вы можете сделать после umount -l, это убедиться, что вся запись завершена и предотвратить запись в будущем , но вы все равно не можете гарантировать, что она была размонтирована.

Со съемными устройствами,если устройство не отключено должным образом, при следующем подключении может произойти странное поведение :

.

  • Устройство получит увеличенное имя устройства, т.е. /dev/sdbстановится /dev/sdc. Сообщения журнала ядра могут по-прежнему ссылаться на /dev/sdb, даже если это устройство больше не существует в виде файла под /dev. (Единственный известный мне способ решить эту проблему — перезагрузить компьютер.)

  • Это может привести к повреждению btrfs. btrfs ожидает, что одновременно присутствует только одна файловая система с данным UUID. Ядро по-прежнему видит один и тот же UUID, доступный на фантомном устройстве и новом устройстве. (Мне пришлось восстановить резервный жесткий диск btrfs ).

systemdподводные камни

4
16.12.2019, 14:58
1 ответ

${var//pattern/replacement} использует шаблоны подстановочных знаков zsh для pattern, те же, что используются для генерации имени файла , также известные как подстановка, которые являются расширенным набором шаблонов подстановочных знаков sh. На синтаксис также влияют опции kshglobи extendedglob. ${var//pattern/replacement}исходит из оболочки Korn.

Я бы рекомендовал включитьextendedglob(set -o extendedglobв вашем ~/.zshrc), что дает вам больше функций (, чем стандартные ERE ), за счет некоторой обратной несовместимости в некоторых крайних случаях.

Вы найдете документацию по адресу info zsh 'filename generation'.

Памятка для сопоставления между ERE и расширенными подстановочными знаками zsh:

Стандартные sh:

  • .->?
  • .*->*
  • [...]->[...]

расширения zsh:

  • *->#
  • +->##
  • {x,y}->(#cx,y)
  • (...|...)->(...|...)

некоторые дополнительные функции недоступны в стандартных ERE:

  • ^pattern(отрицание)
  • x~y(кроме)
  • <12-234>соответствие диапазонам десятичных чисел
  • (#i)сопоставление без учета регистра
  • (#a2)приблизительное сопоставление, допускающее до 2 ошибок.
  • многое другое

Привязка шаблонов подстановочных знаков к началу или концу субъекта зависит от того, какой оператор используется.

  • Шарики, шаблоны case, [[ string = pattern ]]и ${var:#pattern}привязаны к обоим (f*.txt, будут совпадать с foo.txt, а не сXfoo.txtY)
  • ${var#pattern}и ${var##pattern}закреплены в начале
  • ${var%pattern)и ${var%%pattern}закреплены на конце
  • .
  • ${var/pattern/repl}и ${var//pattern/repl}не закреплены, но могут быть закреплены с помощью${var/#pattern}(start )или${var/%pattern}(end ).

(#s)и (#e)также могут использоваться как эквиваленты ^/$( ERE )или \A/\z( PCRE ).

Являются ли повторяющиеся операторы (#, ##, *, (#cx,y),<x-y>)жадными, также зависит от оператора (жадный с ##, %%, //, /не с #, %),это можно изменить с помощью флага расширения параметра S.

Итак, для ваших примеров:

  • regexp-replace nname "[^[:alnum:]]" "_":${var//[^[:alnum:]]/_}
  • regexp-replace nname "_{2,}" "_":${var//_(#c2,)/_}
  • regexp-replace nname "_+$" "":${var%%_#}или${var/%_#}(здесь, используя #для эквивалента *, вы можете использовать ##для эквивалента +, но в данном случае это не будет иметь никакого значения ).
  • regexp-replace nname "^_+" "":${var##_#}или${var/#_#}

Здесь вы можете комбинировать их с${${${var//[^[:alnum:]]##/_}#_}%_}(конвертировать последовательности не -alnums в _и удалять возможный начальный или конечный_).

Другой подход может состоять в том, чтобы извлечь все последовательности альнумов и соединить их с _, используя этот хак:

words=()
: ${var//(#m)[[:alnum:]]##/${words[1+$#words]::=$MATCH}}
var=${(j:_:)words}

regexp-replaceсама по себе является автозагружаемой функцией, которая вызывает [[ $var =~ pattern ]]в цикле. Обратите внимание, что в результате он не работает должным образом с привязкой ^или границей слова или смотрит -за операторами (при использовании опции rematchpcre):

$ a='aaab'; regexp-replace a '^a' x; echo "$a"
xxxb
$ a='abab'; regexp-replace a '\<ab' '<$MATCH>'; echo $a
<ab><ab>

(в первом примере, ^aпоочередно сопоставляется с aaab, aab, ab, bв этом цикле ).

11
27.01.2020, 20:51

Теги

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