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 sed
parte de la tubería realmente funciona, devolviendo 0).
El bash
shell 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 false
comando, 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 PIPESTATUS
elementos a su vez, almacenándolos rc
si fue mayor que el rc
valor anterior .