Après chaque commande, le code de sortie peut être trouvé dans le fichier $?
de sorte que vous auriez quelque chose comme :
ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
Vous devez être prudent avec les commandes pipées, car l'option $?
ne vous donne que le code de retour du dernier élément du tuyau donc, dans le code :
ls -al file.ext | sed 's/^/xx: /"
ne renverra pas de code d'erreur si le fichier n'existe pas (puisque l'option sed
la partie du pipeline fonctionne réellement, en retournant 0).
El bash
Le shell fournit en fait un tableau qui peut aider dans ce cas, à savoir PIPESTATUS
. Ce tableau comporte un élément pour chacun des composants du pipeline, auquel vous pouvez accéder individuellement comme suit ${PIPESTATUS[0]}
:
pax> false | true ; echo ${PIPESTATUS[0]}
1
Notez que cela vous permet d'obtenir le résultat de la fonction false
mais pas le pipeline entier. Vous pouvez également obtenir la liste entière pour la traiter comme bon vous semble :
pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1
Si vous vouliez obtenir le plus grand code d'erreur d'un pipeline, vous pourriez utiliser quelque chose comme :
true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc
Cela passe par chacun des PIPESTATUS
à son tour, en le stockant dans rc
si elle était supérieure à la précédente rc
valeur.
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.