GNU/Linux >> Tutoriels Linux >  >> Linux

Abandon d'un script shell si une commande renvoie une valeur différente de zéro

Ajoutez ceci au début du script :

set -e

Cela entraînera la fermeture immédiate du shell si une commande simple se termine avec une valeur de sortie différente de zéro. Une commande simple est une commande qui ne fait pas partie d'un test if, while ou until, ou qui ne fait pas partie d'un &&ou || liste.

Voir la page de manuel bash(1) sur la commande interne "set" pour plus de détails.

Personnellement, je démarre presque tous les scripts shell avec "set -e". C'est vraiment ennuyeux d'avoir un script qui continue obstinément quand quelque chose échoue au milieu et brise les hypothèses pour le reste du script.


Si vous avez un nettoyage à faire à la sortie, vous pouvez également utiliser 'trap' avec le pseudo-signal ERR. Cela fonctionne de la même manière que le piégeage de INT ou de tout autre signal ; bash lance ERR si une commande sort avec une valeur différente de zéro :

# Create the trap with   
#    trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah

Ou, surtout si vous utilisez "set -e", vous pouvez intercepter EXIT ; votre trap sera alors exécuté lorsque le script se terminera pour une raison quelconque, y compris une fin normale, des interruptions, une sortie causée par l'option -e, etc.


Les instructions if de votre exemple sont inutiles. Faites comme ceci :

dosomething1 || exit 1

Si vous suivez les conseils de Ville Laurikari et utilisez set -e alors pour certaines commandes, vous devrez peut-être utiliser ceci :

dosomething || true

Le || true fera en sorte que le pipeline de commandes ait un true renvoie la valeur même si la commande échoue donc le -e l'option ne tuera pas le script.


Pour ajouter à la réponse acceptée :

Gardez à l'esprit que set -e parfois ne suffit pas, surtout si vous avez des tuyaux.

Par exemple, supposons que vous ayez ce script

#!/bin/bash
set -e 
./configure  > configure.log
make

... qui fonctionne comme prévu :une erreur dans configure interrompt l'exécution.

Demain, vous faites un changement apparemment trivial :

#!/bin/bash
set -e 
./configure  | tee configure.log
make

... et maintenant ça ne marche plus. Ceci est expliqué ici, et une solution de contournement (Bash uniquement) est fournie :

#!/bin/bash
set -e 
set -o pipefail

./configure  | tee configure.log
make

Linux
  1. Comment passer un argument de ligne de commande dans un script shell ?

  2. Le script shell se bloque sur la commande de messagerie ?

  3. Utilisation de la commande passwd à partir d'un script shell

  4. Définir la variable d'environnement dans le script shell/l'accès dans l'application Tomcat

  5. Comment passer un argument dans Expect via la ligne de commande dans un script shell

Comprendre facilement les commandes Shell à l'aide du script "Explain Shell" sous Linux

Comment exécuter une commande / un script Linux Shell en arrière-plan

Comment stocker une commande Linux en tant que variable dans un script shell

Comment exécuter une commande dans un script shell ?

Commande Linux pour vérifier si un script shell est en cours d'exécution ou non

Exécutez un script shell à partir de la commande docker-compose, à l'intérieur du conteneur