#!/bin/bash
err=0
do-this parm someotherparam ; (( err |= $? ))
do-something-else $varz $(commands) ; (( err |= $? ))
and-also-do-this -something ; (( err |= $? ))
finally-do-something-different -yes ; (( err |= $? ))
Isso inicializará a variável err
para zero e, depois de cada comando, definir err
para $err | $?
(um OR bit a bit). Isso definirá err
como um número diferente de zero se qualquer um dos comandos sair com um status de saída diferente de zero e permanecerá diferente de zero no final do script.
Você pode exit "$err"
no final do script, se desejar.
Uma maneira menos manual de obter o mesmo resultado:
err=0
trap '(( err |= $? ))' ERR
# (rest of original script)
Isso define uma interceptação de erro que definirá err
da mesma maneira como acima, sempre que um comando sair com status de saída diferente de zero. A armadilha será executada sob as mesmas circunstâncias sob as quais a opção errexit
shell ( set -e
) teria terminado o script. Para simplificar, você pode ter o trap apenas definido err=1
, se quiser.
Para remover o trap após uma seção do código, use
trap - ERR