Warum stimmt das Echo zweimal mit einigen Dateien überein?

11
$ touch file{1..12}

$ echo *e{1..12}
file1 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12

$ echo *{1..12}
file1 file11 file12 file2 file3 file4 file5 file6 file7 file8 file9 file10 file11 file12

Ich verstehe nicht, warum das passiert. Kann mir bitte jemand erklären?

EmmaV
quelle

Antworten:

21

Klammern sind keine Platzhaltermuster. Überprüfen Sie die Dokumentation der Bash-Erweiterungen : Klammern werden sehr früh im Prozess erweitert, und Platzhaltermuster werden im letzten Schritt erweitert¹.

Zunächst besteht der Befehl aus zwei Wörtern echo, *{1..12}. Nach Klammer Erweiterung enthält der Befehl 13 Worte: echo, *1, *2, ..., *12. Dann werden Platzhaltermuster erweitert. *1Erweitert die Liste der Dateinamen 1, die auf enden und nicht nur, file1sondern auch file11(die anschließend in lexikografischer Reihenfolge sortiert wird) enthalten. Erweitert *2sich ebenfalls zu file12und file2(in dieser Reihenfolge). So erhalten Sie echo, file1, file11, file12, file2, und dann die anderen Platzhalter , dass eine einzelne Datei angepasst: file3, file4, ..., file12.

¹ Vorletzter, wenn Sie der Beschreibung des Handbuchs folgen, aber „Entfernen von Anführungszeichen“ nicht wirklich eine Sache ist - Anführungszeichen werden vor dem Erweiterungsprozess analysiert.

Gilles 'SO - hör auf böse zu sein'
quelle