Вам не нужно kill -USR1
, чтобы узнать, где находится dd
. Вы можете использовать lsof
для отображения позиции дескриптора его входного файла. Получение разбираемого вывода немного заумно, но это работает. Обратите внимание, что 0
- это дескриптор входного файла; если вы передадите if=...
аргумент dd
, а не позволите ему читать из стандартного ввода, то в зависимости от вашей реализации dd
, он может читать из другого дескриптора.
lsof -a -o -p $! -d 0 -F o | sed -n 's/^o[0-9]*t//p'
В Linux вы можете получить эту информацию непосредственно из /proc
.
С таким же успехом можно использовать cat
вместо dd
: это часто быстрее и меньше ошибок.
[
начинает набор. Набор завершается ]
. Но есть способ сделать ]
частью набора, а именно указать ]
в качестве первого символа. Поскольку пустой набор не имеет никакого смысла, это не двусмысленно.
Таким образом, ваши примеры в основном представляют собой точку, за которой следует множество, содержащее точку, поэтому оно соответствует двум точкам.
Более поздние примеры не находят никаких файлов и поэтому возвращаются дословно.
Только цитируемые строки не подлежат подстановке:
$ echo ".[].aliases[]"
.[].aliases[]
Но не -строки в кавычках подлежат подстановке. Строка без кавычек, содержащая *
или ?
или (допустимое)[]
(квадратное выражение ), будет изменена списком файлов, которые соответствуют ей. Точно так же, как *
преобразуется во все файлы в соответствующем каталоге, а ?
соответствует файлам только с одним символом, (действительный)[]
будет соответствовать файлам с символами внутри скобок. Точка — допустимый символ:
$ echo a[.]b
a[.]b
$ touch "a.b"
$ echo a[.]b
a.b
Чтобы можно было сопоставить ]
, это должен быть первый символ в квадратных скобках:
$ touch "a]b"
$ ls a[]]b
a]b
Выражение с пустыми скобками не имеет смысла (и не раскрывается):
$ touch ab
$ ls a[]b
ls: cannot access 'a[]b': No such file or directory
Вот почему это работает:
$ touch a]c abc afc azc a:c a?c aoc
$ ls a[]bfz:?]c
abc a:c a?c a]c afc azc
Для [
идея аналогична:
$ touch a[c
$ ls a[[]c
a[c
, но может стоять в любой позиции выражения в квадратных скобках:
$ ls a[]bf[z:?]c
abc a:c a?c a[c a]c afc azc
$ ls a[]bfz:?[]c
abc a:c a?c a[c a]c afc azc
Размещенная вами строка .[].foo[]
будет соответствовать точке, за которой следует ]
, .
, f
, o
или [
. Это похоже на:
$ echo a[].foo[]c
a[c a]c afc aoc
И это будет соответствовать следующим образом:
$ touch.].f.o.[.a.b.z
$ echo.[].foo[]
...[.].f.o
Обратите внимание, что запись каталога ..
не нужно создавать, так как она существует внутри каждого каталога по умолчанию. Но простая точка .
не будет сопоставляться с глобусом, так как она должна сопоставляться явно (с использованием точки ).
Но это не будет соответствовать ..aliases
, так как выражение в квадратных скобках будет соответствовать только одному символу. Чтобы сопоставить несколько символов, вам нужно использовать*
(что угодно):
$ touch..a..l..i..aliases..alias..ali
$ echo.[].aliases[]
...[.].a
$ echo.[].aliases[]*
...[.].a..a..ali..alias..aliases..i..l