Только цитируемые строки не подлежат сглаживанию:
$ echo ".[].aliases[]"
.[].aliases[]
Но строки без кавычек могут быть повреждены. Строка без кавычек, содержащая *
или a ?
или (допустимое) []
(выражение в скобках), будет изменена списком файлов, которые ей соответствуют. Аналогично тому, как a *
преобразуется во все файлы в соответствующем каталоге, а a ?
будет сопоставлять файлы только с одним символом, так (действительный) []
будет сопоставлять файлы с символами в скобках. Точка является допустимым символом:
$ echo a[.]b
a[.]b
$ touch "a.b"
$ echo a[.]b
a.b
Чтобы иметь возможность соответствовать a, ]
это должен быть первый символ в скобках:
$ 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[]
будет соответствовать точке, за которой следуют a ]
, a .
, a f
, a o
или a [
. Это похоже на:
$ 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