Después de cada comando, el código de salida se puede encontrar en la $?variable para que tenga algo como:
ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
Debe tener cuidado con los comandos canalizados, ya que $?solo le da el código de retorno del último elemento en la tubería, por lo tanto, en el código:
ls -al file.ext | sed 's/^/xx: /"
no devolverá un código de error si el archivo no existe (ya que la sedparte de la tubería realmente funciona, devolviendo 0).
El bashshell realmente proporciona una matriz que puede ayudar en ese caso, ese ser PIPESTATUS. Esta matriz tiene un elemento para cada uno de los componentes de la tubería, al que puede acceder individualmente como ${PIPESTATUS[0]}:
pax> false | true ; echo ${PIPESTATUS[0]}
1
Tenga en cuenta que esto le está dando el resultado del falsecomando, no toda la tubería. También puede obtener la lista completa para procesar como mejor le parezca:
pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1
Si desea obtener el código de error más grande de una tubería, puede usar algo como:
true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc
Esto pasa a través de cada uno de los PIPESTATUSelementos a su vez, almacenándolos rcsi fue mayor que el rcvalor anterior .