Use chaves.
do_something || { log_error; return 1;}
Estou acostumado a 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 seu próprio escopo, e o retorno 1 não terá o comportamento esperado.
Isso é o que eu 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 opinião?
O status de saída da última execução de 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 questão de legibilidade. No entanto, o seu é perfeitamente bom, você só precisa substituir &&
por ;
:
! do_something && log_error ; return 1
&&
significa "executar o próximo comando SOMENTE SE o anterior sair com sucesso", enquanto ;
significa apenas "executar o próximo comando".