GNU/Linux >> Znalost Linux >  >> Linux

Co znamená set -e ve skriptu bash?

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

Linux
  1. Co dělá „exec {fd}/watchdog“ v Bash?

  2. Co znamená `:-` ve skriptu Shell?

  3. Co znamená Ampersand na konci řádku skriptu Shell?

  1. Co znamená [email protected] ve skriptu shellu?

  2. Co to znamená #define X X?

  3. Co dělá tento bash skript? [Pokus o hackování]

  1. Co znamená -s a [[]] ve stavu If v Bash?

  2. Co dělá -e v bash shebang?

  3. Co znamená echo $? dělat?