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

2

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?

    
por ChocoDeveloper 12.01.2013 / 16:48

2 respostas

3

Use chaves.

 do_something || { log_error; return 1;}
    
por 12.01.2013 / 17:20
1

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

    
por 12.01.2013 / 17:21

Tags