842 votes

Sortie automatique du shell bash script en cas d'erreur

J'ai écrit quelques shell script et je pense qu'il serait utile s'il a la capacité d'arrêter l'exécution de ladite script shell si l'une des commandes a échoué. Voir ci-dessous pour un exemple:

#!/bin/bash  

cd some_dir  

./configure --some-flags  

make  

make install

Dans ce cas, si le script ne peut pas changer dans le répertoire indiqué, alors il ne serait certainement pas envie de faire un ./configurer par la suite, il échoue.

Maintenant, je suis bien conscient que je pourrais avoir un si vérifier pour chaque commande (qui je pense est un sans espoir de solution), mais est-il un paramètre global pour rendre le script de sortie si l'une des commandes échoue?

1339voto

Adam Rosenfield Points 176408

Utiliser l' 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 supprimer ce comportement, avec set +e.

86voto

sth Points 91594

Pour quitter le script dès que l'une des commandes échoué, ajouter ceci au début:

set -e

Cela provoque le script pour quitter immédiatement quand une commande qui ne fait pas partie de certains de test (comme dans un if [ ... ] condition ou un && de construire) se termine avec un code de sortie non nulle.

59voto

supercobra Points 1320

Voici comment le 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 *** 
************
'

24voto

Matthew Flaschen Points 131723

Un idiome est:

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

Je me rends compte que peut être longue, mais pour les gros scripts que vous pourriez casser dans les fonctions logiques.

19voto

a_m0d Points 5784

Je pense que ce que vous cherchez est l' trap commande:

trap command signal [signal ...]

Pour plus d'informations, consultez cette page - que vous avez à faire défiler vers le bas un peu plus loin, où il est dit "pièges".

Une autre option est d'utiliser l' set -e de commande en haut de votre script, il fera le script de sortie si aucun programme / commande renvoie une non valeur réelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X