GNU/Linux >> Tutoriels Linux >  >> Linux

Que signifie set -e dans un script bash ?

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

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

Linux
  1. Que fait "exec {fd}/watchdog" dans Bash ?

  2. Que signifie `:-` dans un script shell ?

  3. Que signifie l'esperluette à la fin d'une ligne de script Shell ?

  4. Que signifie « rm est haché » ?

  5. Que signifie cet avertissement ?

Que signifie chmod 777

Que signifie "-" (double tiret) ?

Qu'est-ce que cela signifie d'être "compatible sh" ?

Pas de variable DISPLAY X11 - qu'est-ce que cela signifie ?

Que fait `set -x` ?

Qu'est-ce que echo $ ? fais?