Qual é a maneira correta de lidar com o código de saída do último comando?

3

Atualmente estou fazendo isso em um script de shell POSIX:

success=false

pv --wait "$input_filename" | openssl enc -aes-256-cbc -d -salt -out "$output_filename" && success=true

if [ "$success" = "true" ]
...

O problema é que não tenho certeza se faço isso corretamente.

Por exemplo, eu não entendo a diferença entre essa abordagem e apenas verificando $? .

Por que eu me importo?

Bem, porque o ShellCheck.net me avisou:

SC2181 Check exit code directly with e.g. 'if mycmd;', not indirectly with $?.

    
por Vlastimil 09.12.2017 / 17:21

2 respostas

5

De acordo com o link que você postou, deve ser algo assim:

if pv --wait "$input_filename" | openssl enc -aes-256-cbc -d -salt -out "$output_filename"; then
        code for true
else
        code for false
fi

Nos meus testes, isso pode ser um problema com os pipelines, dependendo do que está do outro lado do seu ... Eu acho que com o openssl você deve estar bem, mas se você estiver trabalhando com algo como cat ou echo I Acreditamos que sempre será tratado como um sucesso, porque o último comando no pipeline sairá com sucesso.

Se você tiver apenas um comando para executar com sucesso ou com falha, algo assim também pode funcionar:

command && code for success 

ou

command || code for failure
    
por 09.12.2017 / 17:38
7

Se você só precisar verificar se o comando foi bem-sucedido ou não, o if command; then foo; else bar; fi deverá atender às suas necessidades.

Mas, se por algum motivo você precisar fazer um tratamento de erros mais complexo, verificar o valor de $? seria mais apropriado:

command
case $? in
  0) foo ;;
  1) bar ;;
  2) baz ;;
  *) something_else ;;
esac
    
por 09.12.2017 / 17:44