Da help set
:
-e Exit immediately if a command exits with a non-zero status.
Ma è considerata una cattiva pratica da alcuni (autori di bash FAQ e irc freenode #bash FAQ). Si consiglia di utilizzare:
trap 'do_something' ERR
per eseguire do_something
funzione quando si verificano errori.
Vedi http://mywiki.wooledge.org/BashFAQ/105
set -e
interrompe l'esecuzione di uno script se un comando o una pipeline presenta un errore, che è l'opposto del comportamento predefinito della shell, che consiste nell'ignorare gli errori negli script. Digita help set
in un terminale per vedere la documentazione per questo comando integrato.
Come per bash - The Set Builtin manual, if -e
/errexit
è impostato, la shell esce immediatamente se una pipeline costituita da un singolo comando semplice, un elenco o un comando composto restituisce uno stato diverso da zero.
Per impostazione predefinita, lo stato di uscita di una pipeline è lo stato di uscita dell'ultimo comando nella pipeline, a meno che pipefail
l'opzione è abilitata (è disabilitata per impostazione predefinita).
In tal caso, lo stato di ritorno della pipeline dell'ultimo comando (quello più a destra) per uscire con uno stato diverso da zero o zero se tutti i comandi escono correttamente.
Se desideri eseguire qualcosa all'uscita, prova a definire trap
, ad esempio:
trap onexit EXIT
dove onexit
è la tua funzione per fare qualcosa all'uscita, come sotto che sta stampando la semplice traccia dello stack:
onexit(){ while caller $((n++)); do :; done; }
Esiste un'opzione simile -E
/errtrace
che intrappolerebbe invece su ERR, ad esempio:
trap onerr ERR
Esempi
Esempio di stato zero:
$ true; echo $?
0
Esempio di stato diverso da zero:
$ false; echo $?
1
Esempi di negazione dello stato:
$ ! false; echo $?
0
$ false || true; echo $?
0
Prova con pipefail
disabilitato:
$ 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
Prova con pipefail
in corso di attivazione:
$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1
Ho trovato questo post mentre cercavo di capire quale fosse lo stato di uscita per uno script interrotto a causa di un set -e
. La risposta non mi sembrava ovvia; da qui questa risposta. Fondamentalmente, set -e
interrompe l'esecuzione di un comando (ad es. uno script di shell) e restituisce il codice dello stato di uscita del comando che ha avuto esito negativo (ovvero lo script interno, non lo script esterno) .
Ad esempio, supponiamo di avere lo script di shell outer-test.sh
:
#!/bin/sh
set -e
./inner-test.sh
exit 62;
Il codice per inner-test.sh
è:
#!/bin/sh
exit 26;
Quando eseguo outer-script.sh
dalla riga di comando, il mio script esterno termina con il codice di uscita dello script interno:
$ ./outer-test.sh
$ echo $?
26