Como executar o comando, e se falhar, executar outro comando e retornar 1?

Como executar o comando, e se falhar, executar outro comando e retornar 1?

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".

informação relacionada