385 votes

Quitter le shell script en fonction du code de sortie du processus

J'ai un shell script qui exécute un certain nombre de commandes. Comment faire pour que le shell script sorte si l'une des commandes sort avec un code de sortie non nul ?

0 votes

Méthode dure : tester la valeur de $? après chaque commande. Méthode simple : mettre set -e o #!/bin/bash -e en haut de votre script Bash.

21voto

http://cfaj.freeshell.org/shell/cus-faq-2.html#11

  1. Comment puis-je obtenir le code de sortie de cmd1 en cmd1|cmd2

    Tout d'abord, notez que cmd1 Le code de sortie peut être non nul et ne signifie toujours pas une erreur. Cela se produit par exemple dans

    cmd | head -1

    Vous pouvez observer un statut de sortie 141 (ou 269 avec ksh93) de cmd1 mais c'est parce que cmd a été interrompu par un signal SIGPIPE quand head -1 se termine après avoir lu une ligne.

    Pour connaître l'état de sortie des éléments d'un pipeline cmd1 | cmd2 | cmd3

    a. avec Z shell ( zsh ):

    Les codes de sortie sont fournis dans le tableau spécial pipestatus. cmd1 Le code de sortie est dans $pipestatus[1] , cmd3 code de sortie dans $pipestatus[3] de sorte que $? est toujours la même chose que $pipestatus[-1] .

    b. avec Bash :

    Les codes de sortie sont fournis dans le PIPESTATUS réseau spécial. cmd1 Le code de sortie est dans ${PIPESTATUS[0]} , cmd3 code de sortie dans ${PIPESTATUS[2]} de sorte que $? est toujours la même chose que ${PIPESTATUS: -1} .

    ...

    Pour plus de détails, voir _Z shell_ .

19voto

Pour Bash :

# This will trap any errors or commands with non-zero exit status
# by calling function catch_errors()
trap catch_errors ERR;

#
# ... the rest of the script goes here
#

function catch_errors() {
   # Do whatever on errors
   #
   #
   echo "script aborted, because of errors";
   exit 0;
}

11voto

Martin W Points 789

Dans Bash, c'est facile. Il suffit de les lier avec && :

command1 && command2 && command3

Vous pouvez également utiliser la fonction imbriquée si construire :

if command1
   then
       if command2
           then
               do_something
           else
               exit
       fi
   else
       exit
fi

3voto

YordanGeorgiev Points 1222
#
#------------------------------------------------------------------------------
# purpose: to run a command, log cmd output, exit on error
# usage:
# set -e; do_run_cmd_or_exit "$cmd" ; set +e
#------------------------------------------------------------------------------
do_run_cmd_or_exit(){
    cmd="$@" ;

    do_log "DEBUG running cmd or exit: \"$cmd\""
    msg=$($cmd 2>&1)
    export exit_code=$?

    # If occurred during the execution, exit with error
    error_msg="Failed to run the command:
        \"$cmd\" with the output:
        \"$msg\" !!!"

    if [ $exit_code -ne 0 ] ; then
        do_log "ERROR $msg"
        do_log "FATAL $msg"
        do_exit "$exit_code" "$error_msg"
    else
        # If no errors occurred, just log the message
        do_log "DEBUG : cmdoutput : \"$msg\""
    fi

}

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