
Estou acostumado com esse estilo em outros idiomas:
do_something || (log_error; return 1) # do something, and if that fails, log the error and then return 1 no matter what, even if the logging fails.
Mas não consigo encontrar um equivalente no bash. O problema é que os parênteses funcionam como uma função com escopo próprio, e o retorno 1 não terá o comportamento esperado.
Isto é o que tenho até agora, mas não é perfeito:
! do_something && log_error && return 1
O problema com isso é que o ! é confuso e o retorno 1 depende do sucesso do registro.
Este é melhor, mas mais detalhado:
do_something || (log_error; return 1) || return 1
Alguma ideia?
Responder1
Use aparelho.
do_something || { log_error; return 1;}
Responder2
O status de saída da última execução do comando é salvo na $?
variável. Então, você poderia fazer algo como o seguinte:
do something
if [[ $? > 0 ]]; then
do log_error; exit 1;
fi
Eu gosto disso por uma questão de legibilidade. No entanto, o seu está perfeitamente bom, você só precisa substituir &&
por ;
:
! do_something && log_error ; return 1
&&
significa "executar o próximo comando SOMENTE SE o anterior tiver sido encerrado com sucesso", enquanto ;
significa apenas "executar o próximo comando".