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
test
…[[
faz parte da sintaxeksh
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.echo
s? Eu esperava para sair depois do primeiro e não chegar ao segundo.exit 1
. Provavelmente foi adicionado mais tarde.