Comment intercepter ERR lors de l'utilisation de "set -e' dans Bash
J'ai un script simple :
#!/bin/bash
set -e
trap "echo BOO!" ERR
function func(){
ls /root/
}
func
Je voudrais piège ERR si mon script ne marche pas (comme il le fera ici b/c je n'ai pas les autorisations pour regarder dans /root). Cependant, lors de l'utilisation de set -e
il n'est pas coincé. Sans set -e
erreur est pris au piège.
Selon la page de manuel de bash, pour set -e
:
... Un piège sur l'erreur, si elle est définie, est exécuté avant que le shell sorties. ...
Pourquoi ce n'est pas mon piège exécuté? À partir de la page de man, il semble comme il se doit.
- En aparté: il est préférable d'apostrophes votre piège des gestionnaires, à moins que vous ne souhaitiez variable références élargi à l'avant.
Vous devez vous connecter pour publier un commentaire.
chepner réponse est la meilleure solution: Si vous voulez de combiner
set -e
(comme:set -o errexit
) avec unERR
piège, également utiliserset -o errtrace
(comme:set -E
).En bref: utiliser
set -eE
au lieu de simplementset -e
:man bash
dit à propos deset -o errtrace
/set -E
:Je crois que ce qui se passe:
Sans
-e
: Lels
commande échoue à l'intérieur de votre fonction, et, en raison d'être la dernière commande de la fonction, la fonction rapportsls
's code de sortie différent de zéro à l'appelant, votre script de niveau supérieur de la portée. Dans que la portée, leERR
piège est en effet, et il est invoqué (mais notez que l'exécution continueront, sauf si vous explicitement appelexit
du piège).Avec
-e
(mais sans-E
): Lels
commande échoue à l'intérieur de votre fonction, et parce queset -e
est, en effet, Bash instantanément sorties, directement à partir de la portée de la fonction - et depuis il n'y a pas deERR
piège en effet il (car il n'avait pas hérité de la portée parent), le piège n'est pas appelé.Tandis que le
man
page n'est pas incorrect, je suis d'accord que ce comportement n'est pas exactement évident - que vous avez à en déduire qu'il.Vous devez utiliser
set -o errtrace
pour la fonction d'hériter le piège.Remplacer
ERR
avecEXIT
et il va fonctionner.La syntaxe de la
trap
commande est:trap [COMMANDS] [SIGNALS]
Pour plus d'informations, veuillez lire http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html
set -o errtrace
est utilisé), vous devez mentionner queEXIT
est aussi appelé dans le cas de succès résiliation, de sorte que vous devez ajouter une condition commeif [[ $? -ne 0 ]] …
pour le gestionnaire.