Sortie automatique du script shell bash en cas d'erreur

j'ai écrit un script shell et je le trouverais utile s'il y avait la possibilité d'arrêter l'exécution de ce script shell si l'une des commandes échouait. Voir ci-dessous 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é alors il ne voudra certainement pas faire un ./ configurer ensuite si elle échoue.

maintenant je suis bien conscient que je pourrais avoir un si vérifier pour chaque commande (dont je pensez que c'est une solution sans espoir), mais y a-t-il un paramètre global pour faire sortir le script si l'une des commandes échoue?

466
demandé sur radman 2010-05-20 08:21:53

7 réponses

utiliser le set -e construire:

#!/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 .

( * ) Note:

La coquille pas sortie si la commande échoue fait partie de la liste de commandes immédiatement après un , alors que ou jusqu'à mot-clé, partie de l'essai suivant le si ou elif mots réservés, partie de toute commande exécutée dans une liste & & ou | | sauf la commande après le dernier & & & ou | | , toute commande dans un pipeline mais le dernier, ou si la valeur de retour de la commande est inversées avec !

(de man bash )

737
répondu Adam Rosenfield 2017-06-09 11:52:46

pour quitter le script dès qu'une des commandes échoue, ajoutez ceci au début:

set -e

cela provoque la sortie immédiate du script quand une commande qui ne fait pas partie d'un test quelconque (comme dans une condition if [ ... ] ou une construction && ) sort avec un code de sortie non-zéro.

56
répondu sth 2010-05-20 04:34:26

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 *** 
************
'
42
répondu supercobra 2014-03-06 12:19:33

utilisez-le en conjonction avec pipefail .

set -e
set -o pipefail

-e (errexit): Abort script à la première erreur, lorsqu'une commande ferme non nul état (sauf dans ou jusqu'à ce que les boucles while, si les tests, la liste des constructions)

- o pipefail: provoque un pipeline à retourner l'état de sortie de la dernière commande dans le tuyau qui a retourné une valeur de retour non nulle.

Chapitre 33. Options

20
répondu Mykhaylo Adamovych 2018-03-12 20:13:57

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

#!/bin/bash -e

cd some_dir  

./configure --some-flags  

make  

make install
17
répondu Petr Peller 2015-08-14 11:04:34

Un idiome est:

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

je me rends compte que cela peut être long, mais pour des scripts plus gros, vous pouvez le casser en fonctions logiques.

16
répondu Matthew Flaschen 2010-05-20 04:26:02

je pense que ce que vous cherchez est la commande trap :

trap command signal [signal ...]

pour en savoir plus, lisez , à la page .

une autre option est d'utiliser la commande set -e en haut de votre script - il fera sortir le script si n'importe quel programme / commande retourne une valeur non vraie.

15
répondu a_m0d 2015-06-08 21:40:35