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?
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
)
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.
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 ***
************
'
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.
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
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.
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.