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 ?
Réponses
Trop de publicités?http://cfaj.freeshell.org/shell/cus-faq-2.html#11
-
Comment puis-je obtenir le code de sortie de
cmd1
encmd1|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 danscmd | head -1
Vous pouvez observer un statut de sortie 141 (ou 269 avec ksh93) de
cmd1
mais c'est parce quecmd
a été interrompu par un signal SIGPIPE quandhead -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_ .
#
#------------------------------------------------------------------------------
# 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
}
- Réponses précédentes
- Plus de réponses
0 votes
Méthode dure : tester la valeur de
$?
après chaque commande. Méthode simple : mettreset -e
o#!/bin/bash -e
en haut de votre script Bash.