Od help set
:
-e Exit immediately if a command exits with a non-zero status.
Někteří to však považují za špatný postup (autoři často kladených otázek bash a irc freenode #bash FAQ). Doporučuje se použít:
trap 'do_something' ERR
spustit do_something
funkce při výskytu chyb.
Viz http://mywiki.wooledge.org/BashFAQ/105
set -e
zastaví provádění skriptu, pokud má příkaz nebo kanál chybu – což je opak výchozího chování shellu, kterým je ignorování chyb ve skriptech. Zadejte help set
v terminálu, abyste viděli dokumentaci k tomuto vestavěnému příkazu.
Jako bash - Manuál Set Builtin, pokud -e
/errexit
je-li nastaven, shell se okamžitě ukončí, pokud kanál skládající se z jediného jednoduchého příkazu, seznamu nebo složeného příkazu vrátí nenulový stav.
Ve výchozím nastavení je stav ukončení kanálu stavem ukončení posledního příkazu v kanálu, pokud není pipefail
možnost je povolena (ve výchozím nastavení je zakázána).
Pokud ano, vrátí se stav kanálu posledního (zcela vpravo) příkazu k ukončení s nenulovým stavem nebo nulou, pokud všechny příkazy skončí úspěšně.
Pokud chcete něco provést při ukončení, zkuste definovat trap
, například:
trap onexit EXIT
kde onexit
je vaše funkce udělat něco při ukončení, jako je například tisk jednoduchého trasování zásobníku:
onexit(){ while caller $((n++)); do :; done; }
Existuje podobná možnost -E
/errtrace
která by místo toho uvízla na ERR, např.:
trap onerr ERR
Příklady
Příklad nulového stavu:
$ true; echo $?
0
Příklad nenulového stavu:
$ false; echo $?
1
Příklady negujících stavů:
$ ! false; echo $?
0
$ false || true; echo $?
0
Otestujte pomocí pipefail
je zakázáno:
$ 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
Otestujte pomocí pipefail
je povoleno:
$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1
Našel jsem tento příspěvek, když jsem se snažil zjistit, jaký byl stav ukončení pro skript, který byl přerušen kvůli set -e
. Odpověď se mi nezdála zřejmá; proto tato odpověď. V podstatě set -e
přeruší provádění příkazu (např. skriptu shellu) a vrátí kód stavu ukončení příkazu, který selhal (tj. vnitřní skript, nikoli vnější skript) .
Předpokládejme například, že mám skript shellu outer-test.sh
:
#!/bin/sh
set -e
./inner-test.sh
exit 62;
Kód pro inner-test.sh
je:
#!/bin/sh
exit 26;
Když spustím outer-script.sh
z příkazového řádku můj vnější skript končí ukončovacím kódem vnitřního skriptu:
$ ./outer-test.sh
$ echo $?
26