Após cada comando, o código de saída pode ser encontrado na $?variável, para que você tenha algo como:
ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
Você precisa ter cuidado com os comandos canalizados, pois o $?único fornece o código de retorno do último elemento no canal , portanto, no código:
ls -al file.ext | sed 's/^/xx: /"
não retornará um código de erro se o arquivo não existir (já que a sedparte do pipeline realmente funciona, retornando 0).
O bashshell realmente fornece uma matriz que pode ajudar nesse caso, nesse ser PIPESTATUS. Essa matriz possui um elemento para cada um dos componentes do pipeline, que você pode acessar individualmente, como ${PIPESTATUS[0]}:
pax> false | true ; echo ${PIPESTATUS[0]}
1
Observe que isso está lhe dando o resultado do falsecomando, não o pipeline inteiro. Você também pode processar a lista inteira como achar melhor:
pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1
Se você deseja obter o maior código de erro de um pipeline, use algo como:
true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc
Isso passa por cada um dos PIPESTATUSelementos, por sua vez, armazenando-o rcse for maior que o rcvalor anterior .