Warum gibt "cat {foo}" nicht foo aus, sondern "cat {foo, bar}"?

12

Ich habe versucht, Textdateien in Unterordnern zu verketten und habe versucht:

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

Dies brachte jedoch nichts zurück. Also, versucht einen nicht existierenden 'Unterordner2' hinzuzufügen

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

Und dieses Mal hat es geklappt und die Dateien erfolgreich verkettet. Warum passiert das?

CDPF
quelle
2
Verwenden Sie echoanstelle von, um catzu sehen, welche Befehlszeile Sie haben. (Oder set -xzum Debuggen verwenden.)
Peter Cordes

Antworten:

22

Per Definition erfordert die geschweifte Klammer in GNU Bash entweder einen Sequenzausdruck oder eine Reihe von durch Kommas getrennten Werten:

Muster, die in geschweifte Klammern eingeschlossen werden sollen, haben die Form einer optionalen Präambel, gefolgt von einer Reihe von durch Kommas getrennten Zeichenfolgen oder einem Sequenzausdruck zwischen zwei geschweiften Klammern, gefolgt von einem optionalen Nachskript.

Sie können das Handbuch für Details lesen .

Einige einfache Beispiele:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2
Arthur Hess
quelle
21

{subfolder1}bewertet zu {subfolder1}, da es keine alternativen gibt. Verwenden Sie subfolder1stattdessen.

Ignacio Vazquez-Abrams
quelle
2
Beachten Sie, dass es sich von in csh(woher die Klammererweiterung stammt) tcshoder unterscheidet fish.
Stéphane Chazelas
1

Klammern werden nur dann erweitert, wenn zwischen ihnen durch Kommas getrennte Zeichenfolgen (z. B. {abc, def} oder range) angegeben sind.

In Ihrem Fall können Sie einfach Unterordner1 schreiben, ohne ihn in geschweifte Klammern zu setzen, da dies nicht erforderlich ist

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var
Neo_Returns
quelle
Dehnt /path/{a,}/filenamesich leider auf die beiden Saiten aus /path/a/filenameund /path//filenamekann das unerwünscht sein.
Kusalananda
danke @Kusalananda für die Berichtigung, ja bash wird eine Warnung liefern, die
besagt, dass die
Nein, Sie erhalten, ambiguous redirect wenn Sie versuchen, in eine Datei umzuleiten, die von einer nicht in Anführungszeichen gesetzten Variablen angegeben wird, die keinen Wert hat, z echo 'hello' >$idontexist.
Kusalananda
1
... oder wenn der Dateiname in der Umleitung auf mehrere Wörter erweitert wird. Wie > *.txtbei mehreren .txtDateien, oder > $filewenn $fileLeerzeichen enthält. Aber es ist natürlich nicht zweideutig, catmehrere Argumente
vorzulegen