![Was ist der Unterschied zwischen ls [13] und ls {1,3}?](https://rvso.com/image/885982/Was%20ist%20der%20Unterschied%20zwischen%20ls%20%5B13%5D%20und%20ls%20%7B1%2C3%7D%3F.png)
Ich habe mit dem Befehl drei Dateien in meinem Verzeichnis erstellt touch inv{1..3}.txt
. Jetzt habe ich zwei Befehle verwendet und ihre Ausgabe ist ziemlich gleich. Diese beiden Befehle sind ls inv[13].txt
und ls {1,3}.txt
.
Worin unterscheiden sich diese beiden also? Worin unterscheiden sich eckige Klammern von geschweiften Klammern? Ich habe auch nach „Linux [..]“ gegoogelt, aber nichts gefunden. Könnte ich also wissen, wie diese Dinge in der Linux-Terminologie heißen?
Danke
Antwort1
{}
wird als Klammererweiterung bezeichnet. Es gibt zwei Formen:{x..y}
und{x,y}
, Ersetzen vonx
undy
durch einen beliebigen alphabetischen oder numerischen Wert.In der ersten Form
{x..y}
wird auf alle Werte vonx
bisy
(einschließlich) erweitert. Beispielsweise{2..5}
wird auf2
,3
,4
, erweitert5
.In der zweiten expliziten Form wird nur zu ,
{x,y}
erweitert . Beispielsweise wird zu und erweitert .x
y
{2,5}
2
5
Wenn keine Erweiterung möglich ist, wird das Muster wörtlich behandelt, z. B. in
{a..3}
.Wichtig zu beachten ist, dass die Klammererweiterung (falls möglich) unabhängig von einer eventuellen Dateiübereinstimmung während der Dateierstellung/-übereinstimmung durchgeführt wird.
[]
ist als Pfadnamenerweiterungsmuster (oder Globbing-Muster) bekannt. Im Gegensatz zur Klammererweiterung können Sie es nur beim Abgleichen von Dateinamen verwenden. Wenn Sie es beim Erstellen von Dateien verwenden, wird es wörtlich behandelt.Es gibt zwei Formen:
[xyz...]
und[x-y]
.In der ersten Form wird jedes einzelne Zeichen innerhalb der eckigen Klammern separat abgeglichen, d. h. jedes Zeichen wird einzeln behandelt. Für
[25].txt
wird also eine Datei mit dem Namen2.txt
oder5.txt
im aktuellen Verzeichnis abgeglichen, während für jede Datei mit dem Namen oder oder[245].txt
abgeglichen wird .2.txt
4.txt
5.txt
In der zweiten Form wird zuerst eine Bereichserweiterung durchgeführt, bevor einzeln abgeglichen wird, andernfalls wird es wörtlich behandelt. Für
[2-5]. txt
wird also jede Datei mit dem Namen2.txt
oder3.txt
oder4.txt
oder abgeglichen5.txt
. Wenn der Bereich nicht erweitert werden kann, wird es wörtlich behandelt, z. B. im Fall von[a-3].txt
.
Ein wichtiger Verhaltensunterschied zwischen diesen beiden ist, wenn mehr Muster abgeglichen werden müssen, obwohl tatsächlich weniger abgeglichen werden. Da die Klammererweiterung auf jeden Fall durchgeführt wird, wird ein Fehler angezeigt, dass bestimmte Dateien nicht existieren, während die Pfadnamenerweiterung für den Rest alles Mögliche abgleicht, ohne dass ein Fehler auftritt:
$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt 2.txt 3.txt
$ ls [1-4].txt
1.txt 2.txt 3.txt
Hinweis zur Portabilität:
Der []
Pfadnamenerweiterungsoperator wird durch POSIX definiert und ist daher zwischen der Bourne-Shell und Derivaten portierbar.
Die Klammererweiterung , {}
ist nicht von POSIX definiert und daher nicht zwischen allen Shells portierbar. Beispielsweise hat dash
( in Ubuntu) dies nicht. Es wurde von übernommen und funktioniert nur auf bestimmten Shells, z. B. , , , . Stellen Sie vor der Implementierung sicher, dass die von Ihnen verwendete Shell dies unterstützt.sh
csh
bash
zsh
ksh93
fish
Beispiel:
$ touch {1..3}.txt
$ ls {1..3}.txt
1.txt 2.txt 3.txt
$ ls {1,2,3}.txt
1.txt 2.txt 3.txt
$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt 2.txt 3.txt
$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory
$ ls [123].txt
1.txt 2.txt 3.txt
$ ls [1-3].txt
1.txt 2.txt 3.txt
$ ls [1-4].txt
1.txt 2.txt 3.txt
$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory
Antwort2
Der wesentliche Unterschied zwischen den beiden Formen wird hier veranschaulicht:
$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt
inv[15].txt
ist ein Glob und erweitert die Liste der passenden Dateien in Ihrem Dateisystem. Dies istPfadnamenerweiterung.
inv{1,5}.txt
erweitert sich inv1.txt
und inv5.txt
unabhängig davon, welche Dateien sich tatsächlich auf Ihrem Dateisystem befinden. Dies istKlammererweiterung.