Après chaque commande, le code de sortie peut être trouvé dans la $?
variable afin que vous ayez quelque chose comme:
ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
Vous devez faire attention aux commandes pipées car la $?
seule vous donne le code retour du dernier élément du tube 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 la sed
partie du pipeline fonctionne réellement, renvoyant 0).
Le bash
shell fournit en fait un tableau qui peut aider dans ce cas, c'est-à-dire PIPESTATUS
. Ce tableau a un élément pour chacun des composants du pipeline, auquel vous pouvez accéder individuellement comme ${PIPESTATUS[0]}
:
pax> false | true ; echo ${PIPESTATUS[0]}
1
Notez que cela vous donne le résultat de la false
commande, pas le pipeline entier. Vous pouvez également obtenir la liste complète à traiter comme bon vous semble:
pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1
Si vous vouliez obtenir le plus gros code d'erreur d'un pipeline, vous pouvez 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
éléments tour à tour, en le stockant rc
s'il était supérieur à la rc
valeur précédente .