Dieses Problem ist sehr spezifisch bash
und liegt daran, dass sie beschlossen haben bash
, die Klammererweiterung von der Dateinamenerweiterung (Globbing) zu trennen und sie zuerst durchzuführen, bevor alle anderen Erweiterungen durchgeführt werden.
Aus der bash
Manpage:
Die Reihenfolge der Erweiterungen lautet: Klammererweiterung; Tilde-Erweiterung, Parameter- und Variablenerweiterung, arithmetische Erweiterung und Befehlssubstitution (von links nach rechts); Wortaufteilung; und Pfadnamenerweiterung.
In Ihrem Beispiel bash
werden Ihre geschweiften Klammern erst angezeigt, nachdem die Befehlsersetzung (the $(echo ...)
) durchgeführt wurde, wenn es einfach zu spät ist.
Dies unterscheidet sich von allen anderen Shells, die die Klammererweiterung kurz vor (und einige sogar als Teil davon) der Pfadnamenerweiterung (Globbing) durchführen. Dies schließt ein, ist aber nicht darauf beschränkt, csh
wo Klammererweiterungen zuerst erfunden wurden.
$ csh -c 'ls `echo "test{1,2}.txt"`'
test1.txt test2.txt
$ ksh -c 'ls $(echo "test{1,2}.txt")'
test1.txt test2.txt
$ var=nope var1=one var2=two bash -c 'echo $var{1,2}'
one two
$ var=nope var1=one var2=two csh -c 'echo $var{1,2}'
nope1 nope2
Das letztere Beispiel ist die gleiche in csh
, zsh
, ksh93
, mksh
oder fish
.
Beachten Sie auch , dass die Klammererweiterung als Teil des Globbing auch über die glob(3)
Bibliotheksfunktion (zumindest unter Linux und allen BSDs) und in anderen unabhängigen Implementierungen (z. B. in Perl :) verfügbar ist perl -le 'print join " ", <test{1,2}.txt>'
.
Warum das anders gemacht wurde, bash
hat wahrscheinlich eine Geschichte dahinter, aber FWIW Ich konnte keine logische Erklärung finden, und ich finde alle post-hoc-Rationalisierungen nicht überzeugend.