Der Befehl set -e führt dazu, dass ein Bash-Skript sofort fehlschlägt, wenn ein Befehl einen Exit-Code ungleich Null zurückgibt.
Gibt es eine einfache und elegante Möglichkeit, dieses Verhalten für einen einzelnen Befehl innerhalb eines Skripts zu deaktivieren?
An welchen Stellen ist diese Funktionalität im Bash-Referenzhandbuch ( http://www.gnu.org/software/bash/manual/bashref.html ) dokumentiert ?
Eine Alternative zum Aufheben der Sicherheitsleistung wäre, einen Erfolg zu erzwingen, egal was passiert. Sie können so etwas tun:
Das gibt 0 (true) zurück, daher sollte das Set -e nicht ausgelöst werden
quelle
faulty_cmd || :
ist eine andere populäre Redewendung dafür. (Das:
ist auch ein Befehl dazutrue
).Wenn Sie versuchen, den Rückgabe- / Fehlercode (Funktion oder Gabel) abzufangen, funktioniert Folgendes:
quelle
Ob die Shell-Option "Sofort beenden" gilt oder ignoriert wird, hängt vom Kontext des ausgeführten Befehls ab (siehe Abschnitt "Bash-Referenzhandbuch" im Set Builtin - dank Arkadiusz Drabczyk).
Insbesondere wird die Option ignoriert, wenn ein Befehl Teil des Tests in einer if-Anweisung ist. Daher ist es möglich, einen Befehl auszuführen und mit einer if-Anweisung wie der folgenden in einem "Sofort-Exit-Kontext" auf Erfolg oder Misserfolg zu prüfen:
Es ist möglich, die "then" -Anweisung wegzulassen und weniger Zeilen zu verwenden:
quelle
Ein anderer Ansatz, den ich ziemlich einfach finde (und der auch auf andere
set
Optionen zutrifft-e
):Verwenden Sie
$-
, um die Einstellungen wiederherzustellen.Beispielsweise:
Obwohl
-e
speziell die Optionen, die andere erwähnt haben (|| true
oder "in einif
" setzen), idiomatischer sein können.quelle
Tatsächlich hatte ich kürzlich eine ähnliche Frage (obwohl ich nicht gepostet habe, sondern mich darum gekümmert habe), und nach allem, was ich sehe, scheint es, als würde man nur set + e vor dem Befehl und set -e danach am elegantesten arbeiten. Hier ist ein Beispiel, in dem die Antwort des Befehls abgerufen und der Fehler nicht weggeworfen wird.
Dies erfasst die Ausgabe von 'Fortune', prüft den Ausgangsstatus und gibt das Echo wieder und sagt es aus. Ich denke, das ist es, wonach Sie gefragt haben, oder zumindest etwas Ähnliches? Wie auch immer, hoffe das hilft.
quelle
Ich starte gerne eine Subshell, wenn ich vorübergehend etwas ändern möchte. Der folgende Befehl zeigt, dass der erste bad_command ignoriert wird und der zweite die Ausführung abbricht.
quelle