Solo le stringhe tra virgolette non sono soggette a oscillazioni:
$ echo ".[].aliases[]"
.[].aliases[]
Ma le stringhe non quotate sono soggette a strappi. Una stringa non quotata che contiene un *
o un ?
o (valido) []
(espressione di parentesi) verrà modificata dall'elenco dei file che la corrispondono. Allo stesso modo in cui a *
si trasformerà in tutti i file nella directory corrispondente e a ?
corrisponderà a file di un solo carattere, a (valido) []
abbinerà i file con i caratteri tra parentesi. Un punto è un carattere valido:
$ echo a[.]b
a[.]b
$ touch "a.b"
$ echo a[.]b
a.b
Per poter abbinare un ]
dovrebbe essere il primo carattere tra parentesi:
$ touch "a]b"
$ ls a[]]b
a]b
Un'espressione di parentesi vuota non ha senso (e non è espansa):
$ touch ab
$ ls a[]b
ls: cannot access 'a[]b': No such file or directory
Ecco perché funziona:
$ touch a]c abc afc azc a:c a?c aoc
$ ls a[]bfz:?]c
abc a:c a?c a]c afc azc
Perché [
l'idea è simile:
$ touch a[c
$ ls a[[]c
a[c
ma potrebbe trovarsi in qualsiasi posizione in un'espressione di parentesi:
$ 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 stringa che hai pubblicato .[].foo[]
corrisponderà a un punto seguito da a ]
, a .
, a f
, a o
o a [
. È simile a:
$ echo a[].foo[]c
a[c a]c afc aoc
E corrisponderà come segue:
$ touch .] .f .o .[ .a .b .z
$ echo .[].foo[]
.. .[ .] .f .o
Si noti che ..
non è necessario creare la voce della directory in quanto esiste all'interno di ogni directory per impostazione predefinita. Ma un punto semplice .
non verrà abbinato da un glob in quanto deve essere abbinato esplicitamente (utilizzando effettivamente un punto).
Ma ciò non corrisponderà ..aliases
poiché l'espressione parentesi corrisponderà a un solo carattere. Per abbinare più personaggi devi usare un *
(qualsiasi cosa):
$ touch ..a ..l ..i ..aliases ..alias ..ali
$ echo .[].aliases[]
.. .[ .] .a
$ echo .[].aliases[]*
.. .[ .] .a ..a ..ali ..alias ..aliases ..i ..l