web-dev-qa-db-fra.com

Quitter un script en cas d'erreur

Je construis un script shell qui a une fonction if comme celle-ci:

if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
    echo $jar_file signed sucessfully
else
    echo ERROR: Failed to sign $jar_file. Please recheck the variables
fi

...

Je veux que l'exécution du script se termine après l'affichage du message d'erreur. Comment puis-je faire ceci?

121
Nathan Campos

Recherchez-vous exit ?

Ceci est le meilleur guide bash autour. http://tldp.org/LDP/abs/html/

Dans le contexte:

if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
    echo $jar_file signed sucessfully
else
    echo ERROR: Failed to sign $jar_file. Please recheck the variables 1>&2
    exit 1 # terminate and indicate error
fi

...
114
Byron Whitlock

Si vous mettez set -e dans un script, le script se termine dès qu'une commande à l'intérieur de celui-ci échoue (c'est-à-dire dès qu'une commande renvoie un statut différent de zéro). Cela ne vous permet pas d'écrire votre propre message, mais souvent, les messages de la commande défaillante suffisent.

L'avantage de cette approche est qu'elle est automatique: vous ne risquez pas d'oublier de traiter un cas d'erreur.

Commandes dont le statut est testé par un conditionnel (tel que if, && ou ||) ne termine pas le script (sinon la condition serait inutile). Un idiome pour la commande occasionnelle dont l'échec n'a pas d'importance est command-that-may-fail || true. Vous pouvez aussi tourner set -e off pour une partie du script avec set +e.

316
Gilles

Si vous voulez pouvoir gérer une erreur au lieu de quitter aveuglément, au lieu d'utiliser set -e, utilisez un trap sur le pseudo signal ERR.

#!/bin/bash
f () {
    errcode=$? # save the exit code as the first thing done in the trap function
    echo "error $errorcode"
    echo "the command executing at the time of the error was"
    echo "$BASH_COMMAND"
    echo "on line ${BASH_LINENO[0]}"
    # do some error handling, cleanup, logging, notification
    # $BASH_COMMAND contains the command that was being executed at the time of the trap
    # ${BASH_LINENO[0]} contains the line number in the script of that command
    # exit the script or return to try again, etc.
    exit $errcode  # or use some other value or do return instead
}
trap f ERR
# do some stuff
false # returns 1 so it triggers the trap
# maybe do some other stuff

D'autres interruptions peuvent être configurées pour gérer d'autres signaux, notamment les signaux Unix habituels et les autres pseudo-signaux Bash RETURN et DEBUG.

39
Dennis Williamson

Voici le moyen de 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 *** 
************
'
8
supercobra