#1 Le 22/02/2012, à 12:01
- Keyhaku
[Résolu] [sh/Awk] impossible de détecter erreurs si pipe avec awk
Salut à tous,
depuis peu j'ai commencé à faire des scripts et je rencontre un problème :
Je cherche à lancer un script qui s'arrête dès qu'il y a une erreur (avec l'option set -e), cela marche plutôt bien sauf dans un cas :
Si je lance une commande et que je redirige la sortie (pipe) sur un awk, le script ne détecte plus l'erreur et continue à exécuter la suite..
Dans cet exemple la commande "abc", est bien détectée comme une erreur et le script s’arrête.
set -e
ERREUR="error.log"
ES=`{ abc | ls ; } 2>$ERREUR`
...
Ici l'erreur n'est pas détectée...
set -e
ERREUR="error.log"
ES=`{ abc | awk ' { print $1 }' ; } 2>$ERREUR`
...
Voilà la sortie lorsque j'exécute le 2eme script avec l'option -x :
$ sh -x test.sh
+ set -e
+ ERROR=tmp.log
+ES=
+exit 0
$ cat error.log
++ abc
++ awk ' {print $1} '
test.sh: ligne 5: abc : commande introuvable
Quelqu'un peut m'expliquer ?
Merci d'avance
Dernière modification par Keyhaku (Le 22/02/2012, à 15:10)
Hors ligne
#2 Le 22/02/2012, à 14:10
- pingouinux
Re : [Résolu] [sh/Awk] impossible de détecter erreurs si pipe avec awk
Bonjour,
Voici un extrait de man bash (rubrique Pipelines) :
The return status of a pipeline is the exit status of the last command,
unless the pipefail option is enabled. If pipefail is enabled, the
pipeline's return status is the value of the last (rightmost) command
to exit with a non-zero status, or zero if all commands exit success‐
fully.
Pour s'arrêter immédiatement, il faut mettre cette ligne en début de script, en plus de set -e :
set -o pipefail
Hors ligne
#3 Le 22/02/2012, à 14:49
- Keyhaku
Re : [Résolu] [sh/Awk] impossible de détecter erreurs si pipe avec awk
Parfait ça marche impec !
Merci beaucoup, je vais pouvoir faire un script vraiment propre avec ça.
Dernière modification par Keyhaku (Le 22/02/2012, à 14:50)
Hors ligne