Dopo ogni comando, il codice di uscita può essere trovato nella $?variabile in modo da avere qualcosa del tipo:
ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
Devi stare attento ai comandi piped poiché l' $?unico ti dà il codice di ritorno dell'ultimo elemento nella pipe così, nel codice:
ls -al file.ext | sed 's/^/xx: /"
non restituirà un codice di errore se il file non esiste (poiché il file sed parte della pipeline funziona effettivamente, restituendo 0).
La bashshell in realtà fornisce un array che può aiutare in quel caso, quell'essere PIPESTATUS. Questo array ha un elemento per ciascuno dei componenti della pipeline, a cui puoi accedere individualmente come ${PIPESTATUS[0]}:
pax> false | true ; echo ${PIPESTATUS[0]}
1
Si noti che questo ti sta ottenendo il risultato del falsecomando, non l'intera pipeline. Puoi anche far elaborare l'intero elenco come ritieni opportuno:
pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1
Se si desidera ottenere il codice di errore più grande da una pipeline, è possibile utilizzare qualcosa del tipo:
true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc
Questo passa attraverso ciascuno degli PIPESTATUSelementi a sua volta, memorizzandolo rcse fosse maggiore del rcvalore precedente .