Существует ложное чувство безопасности:кажется, что файловая система была размонтирована, но на самом деле она была только скрыта от пространства имен файлов/иерархии.
Это означает, что если вы 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
подводные камни Похоже, что ленивое размонтирование илиMNT_DETACH
вызвано либо использованием x-systemd.mount-timeout=
в /etc/fstab
, либо использованием TimeoutIdleSec=
в файле автомонтирования .
Избегайте описанных выше опций systemd
, особенно при использовании btrfs
. Я научился на горьком опыте (см. ссылку на btrfs выше ).
${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
в этом цикле ).