Ab help set
:
-e Exit immediately if a command exits with a non-zero status.
Aber es wird von einigen als schlechte Praxis angesehen (Autoren von bash FAQ und irc freenode #bash FAQ). Es wird empfohlen, Folgendes zu verwenden:
trap 'do_something' ERR
um do_something
auszuführen funktionieren, wenn Fehler auftreten.
Siehe http://mywiki.wooledge.org/BashFAQ/105
set -e
stoppt die Ausführung eines Skripts, wenn ein Befehl oder eine Pipeline einen Fehler aufweist – was das Gegenteil des standardmäßigen Shell-Verhaltens ist, das darin besteht, Fehler in Skripts zu ignorieren. Geben Sie help set
ein in einem Terminal, um die Dokumentation für diesen integrierten Befehl anzuzeigen.
Gemäß bash - The Set Builtin-Handbuch, wenn -e
/errexit
gesetzt ist, wird die Shell sofort beendet, wenn eine Pipeline, die aus einem einzelnen einfachen Befehl, einer Liste oder einem zusammengesetzten Befehl besteht, einen Nicht-Null-Status zurückgibt.
Standardmäßig ist der Exit-Status einer Pipeline der Exit-Status des letzten Befehls in der Pipeline, außer pipefail
Option aktiviert ist (standardmäßig deaktiviert).
Wenn dies der Fall ist, der Rückgabestatus der Pipeline des letzten (ganz rechts) zu beendenden Befehls mit einem Nicht-Null-Status oder Null, wenn alle Befehle erfolgreich beendet werden.
Wenn Sie beim Beenden etwas ausführen möchten, versuchen Sie, trap
zu definieren , zum Beispiel:
trap onexit EXIT
wobei onexit
ist Ihre Funktion, um beim Beenden etwas zu tun, wie unten, wo der einfache Stack-Trace gedruckt wird:
onexit(){ while caller $((n++)); do :; done; }
Es gibt eine ähnliche Option -E
/errtrace
was stattdessen auf ERR abfangen würde, z. B.:
trap onerr ERR
Beispiele
Beispiel für Nullstatus:
$ true; echo $?
0
Beispiel für einen Nicht-Null-Status:
$ false; echo $?
1
Beispiele für Statusverneinungen:
$ ! false; echo $?
0
$ false || true; echo $?
0
Testen Sie mit pipefail
wird deaktiviert:
$ bash -c 'set +o pipefail -e; true | true | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; false | false | true; echo success'; echo $?
success
0
$ bash -c 'set +o pipefail -e; true | true | false; echo success'; echo $?
1
Testen Sie mit pipefail
wird aktiviert:
$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1
Ich habe diesen Beitrag gefunden, als ich versuchte herauszufinden, wie der Exit-Status für ein Skript lautete, das aufgrund eines set -e
abgebrochen wurde . Die Antwort erschien mir nicht offensichtlich; daher diese antwort. Grundsätzlich set -e
bricht die Ausführung eines Befehls (z. B. eines Shell-Skripts) ab und gibt den Exit-Statuscode des fehlgeschlagenen Befehls zurück (d. h. das innere Skript, nicht das äußere Skript) .
Angenommen, ich habe das Shell-Skript outer-test.sh
:
#!/bin/sh
set -e
./inner-test.sh
exit 62;
Der Code für inner-test.sh
ist:
#!/bin/sh
exit 26;
Wenn ich outer-script.sh
ausführe Von der Befehlszeile aus endet mein äußeres Skript mit dem Exit-Code des inneren Skripts:
$ ./outer-test.sh
$ echo $?
26