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 sed
parte do pipeline realmente funciona, retornando 0).
O bash
shell 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 false
comando, 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 PIPESTATUS
elementos, por sua vez, armazenando-o rc
se for maior que o rc
valor anterior .