Question Sortie automatique du script shell bash en cas d'erreur


J'ai écrit un script shell et je le trouverais utile s'il était possible d'arrêter l'exécution dudit script shell si l'une des commandes échouait. Voir ci-dessous pour un exemple:

#!/bin/bash  

cd some_dir  

./configure --some-flags  

make  

make install

Donc, dans ce cas, si le script ne peut pas changer dans le répertoire indiqué, il ne voudra certainement pas faire une configuration ./configure si cela échoue.

Maintenant, je sais bien que je pourrais avoir une vérification if pour chaque commande (ce qui est une solution sans espoir, selon moi), mais existe-t-il un paramètre global pour faire sortir le script si l’une des commandes échoue?


450
2018-05-20 04:21


origine


Réponses:


Utilisez le set -e Builtin:

#!/bin/bash
set -e
# Any subsequent(*) commands which fail will cause the shell script to exit immediately

Alternativement, vous pouvez passer -e sur la ligne de commande:

bash -e my_script.sh

Vous pouvez également désactiver ce comportement avec set +e.

(*) Remarque:

La coquille fait ne pas quitter si la commande qui échoue fait partie de la   liste de commande immédiatement après un tandis que ou jusqu'à mot-clé,   partie du test après le si ou elif mots réservés, partie   de toute commande exécutée dans un && ou || liste sauf la commande   après la finale && ou ||, toute commande dans un pipeline, mais   le dernier, ou si la valeur de retour de la commande est inversée avec    !

(de man bash)


716
2018-05-20 04:36



Pour quitter le script dès que l'une des commandes échoue, ajoutez-la au début:

set -e

Cela provoque la sortie immédiate du script quand une commande qui ne fait pas partie d'un test (comme dans un if [ ... ] condition ou un && construct) se termine avec un code de sortie différent de zéro.


55
2018-05-20 04:34



Voici comment faire:

#!/bin/sh

abort()
{
    echo >&2 '
***************
*** ABORTED ***
***************
'
    echo "An error occurred. Exiting..." >&2
    exit 1
}

trap 'abort' 0

set -e

# Add your script below....
# If an error occurs, the abort() function will be called.
#----------------------------------------------------------
# ===> Your script goes here
# Done!
trap : 0

echo >&2 '
************
*** DONE *** 
************
'

41
2018-03-06 12:19



Utilisez-le conjointement avec pipefail.

set -e
set -o pipefail

-e (errexit): Abandon du script à la première erreur, lorsqu'une commande se termine avec un statut différent de zéro (sauf dans les boucles while ou while, if-tests, les constructions de liste)

-o pipefail: provoque le renvoi par le pipeline du statut de sortie de la dernière commande du canal renvoyant une valeur de retour différente de zéro.

Chapitre 33. Options


20
2018-05-18 12:43



Une alternative à la réponse acceptée qui correspond à la première ligne:

#!/bin/bash -e

cd some_dir  

./configure --some-flags  

make  

make install

17
2017-08-14 11:04



Un idiome est:

cd some_dir && ./configure --some-flags && make && make install

Je me rends compte que cela peut durer longtemps, mais pour les scripts plus volumineux, vous pouvez le décomposer en fonctions logiques.


16
2018-05-20 04:26



Je pense que ce que vous cherchez est le trap commander:

trap command signal [signal ...]

Pour plus d'informations, voir cette page.

Une autre option consiste à utiliser le set -e commande en haut de votre script - cela fera sortir le script si un programme / commande retourne une valeur non vraie.


15
2018-05-20 04:27