Klammererweiterung: Mehrere Befehle ausführen, anstatt in einer Zeile zu erweitern?

11

Wenn Sie die Klammererweiterung in Bash verwenden, so etwas wie

echo {a,b,c}

wird

echo a b c

Gibt es eine Möglichkeit, es auf 3 separate Befehle zu erweitern, einen für jede Erweiterung?

Damit:

echo {a,b,c}

würde werden

echo a
echo b
echo c
houbysoft
quelle

Antworten:

12

Ist dies nur eine Frage, "weil ich es wissen will", oder gibt es einen echten Anwendungsfall dafür? Wir könnten ein bisschen Gymnastik machen, um es zu erledigen:

$ eval echo\ {a,b,c}\;
a
b
c

Aber ich würde jeden jagen, der diese Art von verschleierten Befehlen in unsere Systemskripte einfügt.

Warum nicht stattdessen Klarheit schaffen:

$ for X in {a,b,c}; do echo $X; done

Sie könnten sogar ein paar Zeilenumbrüche einfügen und ein wenig einrücken, damit Sie immer verstehen, was Sie versucht haben.

unpythonisch
quelle
4
@peth - Ich gehe davon aus, dass dies ein vereinfachtes Beispiel ist. Wenn es in der Tat so einfach wie eine Liste ist, dann haben Sie Recht. Wenn es eher so ist, file-{r,b,g}{m,n,o}{x,y.z}.fooist es besser, die Kurzform zu verwenden, als alle 27 Werte aufzulisten.
unpythonisch
@peth - Ich dachte, es wäre eine gute Folgefrage.
unpythonic
Ich wollte das schon lange wissen, danke! :)
Sirex
1
Nun, der Anwendungsfall waren Programme, die nicht mehr als eine Datei akzeptieren (zum Beispiel), also wo die Erweiterung nicht funktionieren würde. Daher wäre es schön, das Programm einfach mehrmals ausführen zu können. Das forfunktioniert dafür, aber es wird noch mehr
getippt
Ich habe es verwendet, um mehrere Git-Zweige zu bereinigen:eval git branch -d \{ branch-a, branch-b }\;
Kit
3

Basierend auf Mark Manns ausgewählter Antwort konnte ich dieses Beispiel weiter ableiten, was großartig funktioniert:

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

Wenn Sie mehrere Klammererweiterungen innerhalb einer Linie verwenden, hätte Marks ursprüngliches Beispiel jede Variation einzeln gedruckt. Stattdessen wollte ich seine Antwort verwenden, um mehrere Dateien zu verschieben / umzubenennen. Um sicherzustellen, dass die Ausgabe dem Format entspricht, das mvnormalerweise erwartet wird ( mv oldfilename newfilename), habe ich das zweite Auftreten der Klammererweiterung vermieden, sodass sie erst nacheval Ausführung des ersten Befehls ausgewertet wird .

Da die obige Ausgabe wie erwartet angezeigt wurde, konnte ich den folgenden Befehl ausführen:

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

Vielen Dank an Mark für seine ursprüngliche Antwort. Bitte stimmen Sie seine Antwort ab, wenn Ihnen gefällt, was seine Antwort mir erlaubt hat :-)

Jon L.
quelle
0
printf '%s\n'  echo{\ a,\ b,\ c}
tae
quelle
eval echo {\ a \ ;, \ b \; \ c \;}
Brian Vandenberg