In bash
möchte ich manchmal mehrere Befehle hintereinander ausführen und nicht warten, bis sie beendet sind, bevor ich die neuen eingebe. Also mache ich so etwas:
cmd1; cmd2; cmd3
Leider kann einer der Befehle fehlschlagen. In diesem Fall würde ich gerne aufhören. Gibt es eine einfache Möglichkeit, dies zu tun, aber es so zu gestalten, dass ich die Befehle nur weiter ausführe, wenn der vorherige Befehl einen Exit-Code von 0 hat?
command-line
bash
pythonische Metapher
quelle
quelle
Antworten:
Verwenden
&&
Operator,In shellscripting,
&&
und||
Betreiber nach optimierte Implementierung von logischen Operatoren in C modelliert&&
mittels UND - Operator, und||
Mittel OR. Unix ist eng mit C verwandt, und in C wird der zweite Operand von logischen Operatoren nicht ausgewertet, wenn das Ergebnis bereits vom ersten Operanden bekannt ist. ZB"false && x"
istfalse
für jedex
, so gibt es keine Notwendigkeit zu evaluierenx
(insbesondere wennx
es sich um einen Funktionsaufruf handelt); ähnlich für"true || x"
. Dies wird auch als Kurzschluss Semantik .Und in Unix ist es üblich, die Rückgabewerte von Befehlen als Wahrheitswerte für "erfolgreiche Fertigstellung" zu interpretieren: Exit-Code 0 bedeutet
true
(Erfolg), ungleich Null bedeutetfalse
(Misserfolg). Wenn der erste Befehl incmd1 && cmd2
zurückgegeben wird"false"
(Exit-Status ungleich Null, was auf einen Fehler hinweist), ist der Status des zusammengesetzten Befehls bekannt: Fehler. Die Gesamtinterpretation voncmd1 && cmd2
kann also lauten: "Ausführencmd1
, UND DANN, wenn es nicht fehlgeschlagen istcmd2
". Welches ist, was Sie im Grunde in Ihrer Frage wollen.Ähnlich mit OR:
cmd1 || cmd2
kann interpretiert werden als "Ausführencmd1
, OR WENN es fehlschlägtcmd2
".Protip: Für längere Ketten
&&
sollten Sie in Betracht ziehen,set -e
Ihr Skript einzufügen . Es ändert sich im Grunde das Semikolon;
in&&
, mit ein paar Sonderfälle.quelle
||
A || B
ist genau das gleiche wie die [Kurzschließen] logische A oder B .A || B
ist Erfolg , wennA
war Erfolg , oder wennA
war Versagen aberB
war Erfolg ; undA || B
ist Versagen , wennA
war Ausfall undB
warfailure
. Ähnlich&&
folgt es für logisches UND.;
(oder Newline) standardmäßig tut.set -e
wird sich;
in&&
, grob gesagt.set +e
[der Standard] wirdA; B
zu dem, was Sie sagen: laufenA
, dann egal was laufenB
."Befehle verketten und gruppieren"
Pings führt die verkettete Gruppe von Befehlen in Klammern aus, wenn dies nicht erfolgreich ist.
Beachtung:
Die Liste muss mit einem ";" abgeschlossen werden.
Zwischen Klammern und den gruppierten Befehlen müssen Leerzeichen stehen!
quelle
Einfach mit dem
&&
Betreiber. Zum Beispiel:Wenn einer der Befehle fehlschlägt (einen anderen Exit-Wert als 0 zurückgibt), werden die anderen Befehle nicht ausgeführt.
quelle