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

2644
houbysoft

Wenn Sie in bash eine Klammererweiterung verwenden, ähnelt dies etwa

echo 

wird

echo a b c 

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

Damit:

echo 

würde werden

echo a echo b echo c 
11

3 Antworten auf die Frage

12
unpythonic

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

$ eval echo\ \; a b c 

Aber ich würde jemanden jagen, der diese Art von Verschleierungsbefehlen in unsere Systemskripte steckt.

Warum nicht stattdessen Klarheit schaffen:

$ for X in ; do echo $X; done 

Sie könnten sogar eine ganze Reihe von Zeilenumbrüchen eingeben und ein wenig einrücken, damit Sie immer verstehen können, was Sie tun wollten.

@peth - Ich gehe davon aus, dass dies ein vereinfachtes Beispiel ist. Wenn es tatsächlich so einfach ist wie eine Liste, dann haben Sie recht. Wenn es mehr wie `file- .foo` ist, ist es besser, die Kurzform zu verwenden, als alle 27 Werte aufzulisten. unpythonic vor 13 Jahren 4
@peth - Ich dachte, es wäre eine gute Anschlussfrage. unpythonic vor 13 Jahren 0
ich wollte das schon lange wissen, danke! :) Sirex vor 13 Jahren 0
Nun, der Anwendungsfall waren Programme, die nicht mehr als eine Datei akzeptieren (zum Beispiel), sodass die Erweiterung nicht funktioniert. Daher wäre es schön, das Programm einfach mehrmals ausführen zu können. Das `for` funktioniert dafür, aber es ist noch mehr Tipp: P houbysoft vor 13 Jahren 1
Ich habe es verwendet, um mehrere Git-Zweige zu bereinigen: `eval git branch -d \ \; ` Kit vor 7 Jahren 0
3
Jon L.

Basierend auf Mark Manns ausgewählter Antwort konnte ich dieses Beispiel weiter ableiten, das hervorragend funktioniert:

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

Was angezeigt wird, ist, wenn Sie mehrere Klammererweiterungen in einer Zeile verwenden, hätte Marks Originalbeispiel jede Variation einzeln gedruckt. Stattdessen wollte ich mit seiner Antwort mehrere Dateien verschieben / umbenennen. Um sicherzustellen, dass die Ausgabe mit dem Format übereinstimmt, das mvnormalerweise erwartet wird ( mv oldfilename newfilename), bin ich vor der zweiten Erweiterung der Klammer geflüchtet, sodass sie erst ausgewertet wird, nachdem der ursprüngliche evalBefehl ausgeführt wurde.

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

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

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

0
tae
printf '%s\n' echo{\ a,\ b,\ c} 
eval echo {\ a \;, \ b \;, \ c \;} Brian Vandenberg vor 13 Jahren 0