De help set
:
-e Exit immediately if a command exits with a non-zero status.
Mais c'est considéré comme une mauvaise pratique par certains (bash FAQ et irc freenode #bash FAQ auteurs). Il est recommandé d'utiliser :
trap 'do_something' ERR
pour exécuter do_something
fonction en cas d'erreurs.
Voir http://mywiki.wooledge.org/BashFAQ/105
set -e
arrête l'exécution d'un script si une commande ou un pipeline a une erreur - ce qui est l'opposé du comportement par défaut du shell, qui consiste à ignorer les erreurs dans les scripts. Tapez help set
dans un terminal pour voir la documentation de cette commande intégrée.
Selon bash - Le manuel Set Builtin, si -e
/errexit
est défini, le shell se termine immédiatement si un pipeline composé d'une seule commande simple, d'une liste ou d'une commande composée renvoie un statut non nul.
Par défaut, l'état de sortie d'un pipeline est l'état de sortie de la dernière commande du pipeline, sauf si le pipefail
est activée (elle est désactivée par défaut).
Si tel est le cas, le statut de retour du pipeline de la dernière commande (la plus à droite) pour quitter avec un statut différent de zéro, ou zéro si toutes les commandes se terminent avec succès.
Si vous souhaitez exécuter quelque chose à la sortie, essayez de définir trap
, par exemple :
trap onexit EXIT
où onexit
est votre fonction pour faire quelque chose à la sortie, comme ci-dessous qui imprime la trace de pile simple :
onexit(){ while caller $((n++)); do :; done; }
Il existe une option similaire -E
/errtrace
qui piégerait sur ERR à la place, par exemple :
trap onerr ERR
Exemples
Exemple de statut zéro :
$ true; echo $?
0
Exemple d'état non nul :
$ false; echo $?
1
Exemples d'états négatifs :
$ ! false; echo $?
0
$ false || true; echo $?
0
Tester avec pipefail
étant désactivé :
$ 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
Tester avec pipefail
étant activé :
$ bash -c 'set -o pipefail -e; true | false | true; echo success'; echo $?
1
J'ai trouvé ce message en essayant de déterminer quel était le statut de sortie d'un script qui avait été abandonné en raison d'un set -e
. La réponse ne m'a pas semblé évidente; d'où cette réponse. En gros, set -e
interrompt l'exécution d'une commande (par exemple, un script shell) et renvoie le code d'état de sortie de la commande qui a échoué (c'est-à-dire le script interne, pas le script externe) .
Par exemple, supposons que j'ai le script shell outer-test.sh
:
#!/bin/sh
set -e
./inner-test.sh
exit 62;
Le code pour inner-test.sh
est :
#!/bin/sh
exit 26;
Quand j'exécute outer-script.sh
depuis la ligne de commande, mon script externe se termine par le code de sortie du script interne :
$ ./outer-test.sh
$ echo $?
26