GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was bedeutet set -e in einem Bash-Skript?

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

Linux
  1. Was macht „exec {fd}/watchdog“ in Bash?

  2. Was bedeutet „:-“ in einem Shell-Skript?

  3. Was bedeutet kaufmännisches Und am Ende einer Shell-Skriptzeile?

  4. Was bedeutet [email protected] in einem Shell-Skript?

  5. Was bedeutet, wenn [[ $? -ne 0 ]]; bedeuten in .ksh

Was bedeutet chmod 777

Was bedeutet es, „sh-kompatibel“ zu sein?

Keine X11-DISPLAY-Variable - was bedeutet das?

Was bedeutet #define X X?

Was macht das -e in einem Bash-Shebang?

Was bedeutet echo $? tun?