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
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?return
para retornar de uma função de shell, mas continue executando o script de onde foi chamado; usarexit
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 eexit
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.Respostas:
Use chaves.
fonte
O status de saída do último comando executado é salvo no
$?
variável. Então, você poderia fazer algo como o seguinte:Eu gosto disso por questão de legibilidade. No entanto, o seu é perfeitamente bom, você só precisa substituir
&&
com;
:&&
significa "executar o próximo comando SOMENTE SE o anterior saiu com sucesso" enquanto;
significa apenas "executar o próximo comando".fonte
return 1
é executado em caso de sucesso.! ls /etc && echo "FAIL" > ~/log ; return 1
E dels /etcaaa && echo "FAIL" > ~/log ; return 1
é 1.