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 bash
shell 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 false
comando, 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 PIPESTATUS
elementi a sua volta, memorizzandolo rc
se fosse maggiore del rc
valore precedente .