Je suis confus sur la signification du code de sortie à la fin dun script bash: je connais ce code de sortie 0 signifie quil sest terminé avec succès, et quil y a beaucoup plus de numéros de code de sortie (127 si je ne me trompe pas?)
Ma question concerne le moment où le code de sortie 0 à la fin dun script est cela force le code de sortie à 0 même si le script a échoué ou a-t-il une autre signification?
Commentaires
Réponse
La commande intégrée exit
quitte le shell (de Bash « s référence ):
exit [n]
Quitte le shell, retourne un état de n au parent du shell. Si n est omis, létat de sortie est celui de la dernière commande exécutée. Tout trap sur EXIT est exécuté avant la fin du shell.
Courir jusquà la fin du fichier se termine également, renvoyant le code de retour de la dernière commande, donc oui, un exit 0
final fera sortir le script avec un statut de réussite quel que soit le statut de sortie de les commandes précédentes. (Autrement dit, en supposant que le script atteigne le dernier exit
.) À la fin dun script, vous pouvez également utiliser true
ou pour obtenir un code de sortie de zéro.
Bien sûr, plus souvent, vous » utiliseriez exit
depuis lintérieur dun if
pour terminer le script au milieu.
Ceux-ci devraient afficher un 1 ($?
contient le code de sortie renvoyé par la commande précédente) :
sh -c "false" ; echo $? sh -c "false; exit" ; echo $?
Bien que cela devrait afficher un 0:
sh -c "false; exit 0" ; echo $?
Je « ne suis pas sûr si le concept du script « échouant » lors de lexécution dun exit
a du sens, car il est tout à fait possible que certaines commandes exécutées par le script échouent, mais le script lui-même réussit . Cest à lauteur du script de décider ce qui est un succès et ce qui ne lest pas.
De plus, la plage standard pour les codes de sortie est 0..255. Les codes supérieurs à 127 sont utilisés par le shell pour indiquer un processus terminé par un signal, mais ils peuvent être renvoyés de la manière habituelle. Lappel système wait
renvoie en fait une valeur plus large, le reste contenant des bits détat définis par le système dexploitation.
Commentaires
- Cool, je ne savais pas ' sur la numérotation des codes de sortie 8 bits. Merci!
- Notez que lorsquun processus est tué, il ne se termine pas avec un code de sortie > 127. Il ' s juste que certains shells fixent
$?
à 128 + signum dans ce cas. Voir Code de sortie par défaut lorsque le processus est terminé? pour plus de détails. -
exit 0
ne retournera que 0, si la sortie est exécutée. (il pourrait sortir par une autre route).
Réponse
0 signifie succès, les entiers positifs signifient échec. Il existe 255 codes derreur différents, mais les valeurs 126 et supérieures sont réservées pour indiquer quun programme na pas pu démarrer (126 ou 127) ou a été tué par un signal (129 et plus). Voir Code de sortie par défaut à la fin du processus? et Quelles valeurs de retour / sortie puis-je utiliser dans les fonctions / scripts bash? pour plus dinformations.
Le statut de sortie dun script shell est le statut de sortie de la dernière commande exécutée par le script. Par exemple,
#!/bin/sh somecommand
renvoie létat de sortie de somecommand
, alors que
#!/bin/sh somecommand exit 0
renvoie 0 indépendamment de ce que somecommand
est retourné.Ce second script pourrait aussi être écrit
#!/bin/sh somecommand true
Mettre exit 0
à la fin dun script ne cause pas forcément il renvoie 0. Cela ne le fait retourner 0 que lorsque la fin du script est atteinte. Par exemple, le script suivant renvoie toujours 3:
#!/bin/sh exit 3 exit 0
Le Le script suivant renvoie également toujours un code derreur, en plus dafficher un message concernant une erreur de syntaxe:
#!/bin/sh } exit 0
Le script suivant renvoie 1 ou 0 selon son premier argument:
#!/bin/sh if [ "$1" = "foo" ]; then exit 1 fi exit 0
Le script suivant renvoie le statut de somecommand
, depuis set -e
provoque la fermeture du script si somecommand
échoue:
#!/bin/sh set -e somecommand exit 0
exit 0
, il se terminera avec le code de sortie de 0 indépendamment de ce qui se passe dans le script.exit 0
, il se terminera avec le code 0 uniquement si cette dernière instruction a été exécutée. Le seul impact deexit 0
à la fin du script est de renvoyer 0 au lieu du statut de linstruction précédente.exit 0
à tout moment, il renverra le code de sortie 0 indépendamment de ce qui sest passé avant cela.