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