Je teste différentes choses dans les scripts bash et je suis tombé sur un problème dont je ne peux pas obtenir dexplication.
Je suis écrire volontairement une mauvaise commande, pour obtenir un code de sortie différent de 0, mais il semble que jobtienne toujours 0.
Le code que je « m exécute est:
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}"
La sortie de mon code est:
id: option inconnue – s
Essayez « id –help » pour plus dinformations.
Votre commande na pas pu sexécuter avec le code de sortie 0
Votre nom dutilisateur est
Je suppose que dune certaine façon, il affiche le code de sortie de la commande echo? Même ainsi, si le code de sortie est 0, pourquoi entre-t-il dans linstruction if?
Si tel est le cas, comment puis-je faire pour afficher le code de sortie réel qui devrait être affiché?
Réponse
Dans votre code, dans linstruction if
, le statut de sortie qui obtient imprimé est létat de sortie du test [[ ${?} -ne 0 ]]
. La valeur $?
est toujours le statut de sortie de la commande la plus récemment exécutée, et le test compte comme une commande, au moins en ce qui concerne la définition de la valeur de $?
à son résultat.
Si vous souhaitez afficher létat de sortie de id
, assignez-le à une variable dont la valeur ne changera pas,
id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi
test
…[[
fait partie de la syntaxeksh
et sexécute dans le cadre de linterpréteur, mais pas en tant quinterpréteur intégré Il semble cependant que cette partie de linterpréteur réinitialise le code de sortie mémorisé.echo
? Je laurais attendu pour quitter après le premier, et ne pas arriver au second.exit 1
. Il a probablement été ajouté plus tard.