Estou testando coisas diferentes no script bash e me deparei com um problema que não consigo obter uma explicação para isso.

Estou escrever propositalmente um comando errado para obter um código de saída diferente de 0, mas de alguma forma parece que ainda obtenho 0.

O código que estou executando é:

USER_NAME=$(id -uns) if [[ ${?} -ne 0 ]] then echo "Your command failed to execute with exit code ${?}" exit 1 fi echo "Your username is ${USER_NAME}" 

O resultado do meu código é:

id: opção desconhecida – s

Tente “id –help” para obter mais informações.

Falha ao executar o comando com o código de saída 0

Seu nome de usuário é

Estou supondo que, de alguma forma, ele está exibindo o código de saída para o comando echo? Mesmo assim, se o código de saída for 0, por que ele entra na instrução if?

Se for esse o caso, como posso fazer com que exiba o código de saída real que deve ser exibido?

Resposta

Em seu código, dentro da instrução if, o status de saída que obtém impresso é o status de saída do teste [[ ${?} -ne 0 ]]. O valor $? é sempre o status de saída do comando executado mais recentemente, e o teste conta como um comando, pelo menos no que diz respeito à configuração do valor de $? ao seu resultado.

Se você deseja imprimir o status de saída de id, atribua-o a uma variável cujo valor não será alterado,

id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi 

Comentários

  • Este script não POSIX não executa test[[ faz parte da sintaxe ksh e é executado como parte do interpretador, mas não como interno . No entanto, parece que esta parte do interpretador redefine o código de saída lembrado.
  • Por que o script executa ambos os echo s? Eu esperava para sair depois do primeiro e não chegar ao segundo.
  • @pericynthion Eles não estão mostrando o código que realmente executaram. A saída que eles mostram vem de uma versão de seu código sem a instrução exit 1. Provavelmente foi adicionado mais tarde.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *