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 seu próprio escopo, e o retorno 1 não terá o comportamento esperado.
Isto é 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 ideia?
return
para retornar de uma função de shell, mas continue executando o script de onde foi chamado; usar exit
para sair do shell inteiro (ou seja, o script). A menos que você esteja entre parênteses, caso em que você está em um subshell e exit
só sai da expressão entre parênteses (subshell).
exec >output.log 2>error.log
e isso não vai estragar o script de chamada. Ou você pode usar { payload; } >output.log 2>error.log
e o redirecionamento só se aplica ao que está entre parênteses, sem precisar de uma subcamada.
return
A instrução é significativa apenas quando dentro de um script ou função - não na linha de comando. Quem você deseja retornar 1 para?