Nur Zeichenfolgen in Anführungszeichen unterliegen keiner Verschiebung:
$ echo ".[].aliases[]"
.[].aliases[]
Zeichenfolgen ohne Anführungszeichen können sich jedoch verschieben. Eine nicht in Anführungszeichen gesetzte Zeichenfolge, die ein *
oder ein ?
oder (gültig) []
(Klammerausdruck) enthält, wird durch die Liste der Dateien geändert, die mit ihr übereinstimmen. So wie sich a *
in alle Dateien im passenden Verzeichnis verwandelt und a ?
Dateien mit nur einem Zeichen vergleicht, vergleicht a (gültig) []
Dateien mit den Zeichen in Klammern. Ein Punkt ist ein gültiges Zeichen:
$ echo a[.]b
a[.]b
$ touch "a.b"
$ echo a[.]b
a.b
Um mit einem übereinstimmen zu können, muss ]
es das erste Zeichen in den Klammern sein:
$ touch "a]b"
$ ls a[]]b
a]b
Ein leerer Klammerausdruck macht keinen Sinn (und ist nicht erweitert):
$ touch ab
$ ls a[]b
ls: cannot access 'a[]b': No such file or directory
Deshalb funktioniert das:
$ touch a]c abc afc azc a:c a?c aoc
$ ls a[]bfz:?]c
abc a:c a?c a]c afc azc
Denn [
die Idee ist ähnlich:
$ touch a[c
$ ls a[[]c
a[c
Es kann sich jedoch an einer beliebigen Position in einem Klammerausdruck befinden:
$ 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
Die von Ihnen eingegebene Zeichenfolge entspricht .[].foo[]
einem Punkt, gefolgt von einem ]
, einem .
, einem f
, einem o
oder einem [
. Es ist ähnlich wie:
$ echo a[].foo[]c
a[c a]c afc aoc
Und es wird wie folgt passen:
$ touch .] .f .o .[ .a .b .z
$ echo .[].foo[]
.. .[ .] .f .o
Beachten Sie, dass der Verzeichniseintrag ..
nicht erstellt werden muss, da er standardmäßig in jedem Verzeichnis vorhanden ist. Ein einfacher Punkt .
wird jedoch nicht von einem Glob abgeglichen, da er explizit abgeglichen werden muss (indem tatsächlich ein Punkt verwendet wird).
Dies stimmt jedoch nicht überein, ..aliases
da der Klammerausdruck nur mit einem Zeichen übereinstimmt . Um mehrere Zeichen zu finden, müssen Sie ein *
(beliebiges) verwenden:
$ touch ..a ..l ..i ..aliases ..alias ..ali
$ echo .[].aliases[]
.. .[ .] .a
$ echo .[].aliases[]*
.. .[ .] .a ..a ..ali ..alias ..aliases ..i ..l