Solo las cadenas citadas no están sujetas a glob:
$ echo ".[].aliases[]"
.[].aliases[]
Pero las cadenas que no se citan están sujetas a un problema. La lista de archivos que coinciden modificará una cadena sin comillas que contiene una *
o una ?
o (válida) []
(expresión de paréntesis). De la misma manera que a *
se transformará en todos los archivos en el directorio correspondiente y a ?
coincidirá con los archivos de un solo carácter, un (válido) []
hará coincidir los archivos con los caracteres dentro de los corchetes. Un punto es un carácter válido:
$ echo a[.]b
a[.]b
$ touch "a.b"
$ echo a[.]b
a.b
Para poder hacer coincidir un ]
, debe ser el primer carácter dentro de los corchetes:
$ touch "a]b"
$ ls a[]]b
a]b
Una expresión de paréntesis vacía no tiene sentido (y no se expande):
$ touch ab
$ ls a[]b
ls: cannot access 'a[]b': No such file or directory
Por eso funciona esto:
$ touch a]c abc afc azc a:c a?c aoc
$ ls a[]bfz:?]c
abc a:c a?c a]c afc azc
Para [
la idea es similar:
$ touch a[c
$ ls a[[]c
a[c
pero podría estar en cualquier posición en una expresión de paréntesis:
$ 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
La cadena que ha publicado .[].foo[]
coincidirá con un punto seguido de a ]
, a .
, a f
, a o
o a [
. Esto es similar a:
$ echo a[].foo[]c
a[c a]c afc aoc
Y coincidirá de la siguiente manera:
$ touch .] .f .o .[ .a .b .z
$ echo .[].foo[]
.. .[ .] .f .o
Tenga en cuenta que la entrada del directorio ..
no necesita ser creada ya que existe dentro de cada directorio de manera predeterminada. Pero un punto simple .
no coincidirá con un globo, ya que debe coincidir explícitamente (mediante el uso de un punto).
Pero eso no coincidirá, ..aliases
ya que la expresión de paréntesis solo coincidirá con un carácter. Para hacer coincidir varios caracteres, debe usar un *
(cualquier cosa):
$ touch ..a ..l ..i ..aliases ..alias ..ali
$ echo .[].aliases[]
.. .[ .] .a
$ echo .[].aliases[]*
.. .[ .] .a ..a ..ali ..alias ..aliases ..i ..l