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 

Commentaires

  • Ce script non POSIX nexécute pas test[[ fait partie de la syntaxe ksh 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é.
  • Pourquoi le script exécute-t-il les deux echo? Je laurais attendu pour quitter après le premier, et ne pas arriver au second.
  • @pericynthion Ils ne montrent pas le code quils ont réellement exécuté. La sortie quils affichent provient de une version de leur code sans linstruction exit 1. Il a probablement été ajouté plus tard.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *