Code de sortie à la fin d'un script bash

22

Je suis confus quant à la signification du code de sortie à la fin d'un script bash: je sais que le code de sortie 0 signifie qu'il s'est terminé avec succès et qu'il y a beaucoup plus de numéros de codes de sortie (127 si je ne me trompe pas?)

Ma question concerne le fait de voir le code de sortie 0 à la fin d'un script, force-t-il le code de sortie à 0 même si le script a échoué ou a-t-il une autre signification?

Busted
la source
2
Si un script se termine par exit 0, il se terminera avec le code de sortie de 0 indépendamment de ce qui se passe dans le script.
Hatclock
@Hatclock pourquoi n'avez-vous pas publié votre réponse comme une réponse complète? en tant que commentaire, je ne peux pas le marquer, et je ne pense pas que vous obtenez de faux points Internet pour répondre (non?) Juste une pensée ... (bravo pour la réponse rapide)
Busted
1
Je suis dans une gare sur mon téléphone, je n'aime pas trop taper trop sur mon téléphone. ilkkachu semble cependant avoir une bonne réponse!
Hatclock
2
@Hatclock Non, pas du tout. Si un script se termine par exit 0, il ne sortira avec le code 0 que si cette dernière instruction a été exécutée. Le seul impact de exit 0à la fin du script est de retourner 0 au lieu du statut de l'instruction précédente.
Gilles 'SO- arrête d'être méchant'

Réponses:

22

La commande intégrée exitquitte le shell (à partir de la référence de Bash ):

exit [n]
Quittez le shell, en renvoyant 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.

L'exécution à la fin du fichier se termine également, renvoyant le code retour de la dernière commande, donc oui, une finale exit 0fera que le script se terminera avec un état réussi, quel que soit l'état de sortie des commandes précédentes. (Autrement dit, en supposant que le script atteigne la finale exit.) À la fin d'un script, vous pouvez également utiliser trueou :pour obtenir un code de sortie de zéro.

Bien sûr, plus souvent, vous utiliseriez exitde l'intérieur d'un ifpour terminer le script au milieu.

Ceux-ci doivent 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 imprimer un 0:

sh -c "false; exit 0" ; echo $?

Je ne sais pas si le concept du script "échouant" lors de l'exécution d'un exitest logique, car il est tout à fait possible que certaines commandes exécutées par le script échouent, mais que le script lui-même réussisse. C'est à l'auteur du script de décider ce qui est un succès et ce qui ne l'est pas.

En outre, 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 retournés de la manière habituelle. L' waitappel système renvoie en fait une valeur plus large, le reste contenant des bits d'état définis par le système d'exploitation.

ilkkachu
la source
Cool, je ne connaissais pas la numérotation des codes de sortie 8 bits. Merci!
Busted
Notez que lorsqu'un processus est tué, il ne se termine pas avec un code de sortie> 127. C'est juste que certains shells définis $?sur 128 + signum dans ce cas. Voir Code de sortie par défaut à la fin du processus? pour plus de détails.
Stéphane Chazelas
exit 0ne renverra que 0 si la sortie est exécutée. (il pourrait sortir par un itinéraire différent).
ctrl-alt-delor
18

0 signifie succès, des entiers positifs signifient échec. Il existe 255 codes d'erreur différents, mais les valeurs 126 et supérieures sont réservées pour indiquer qu'un programme n'a pas pu démarrer (126 ou 127) ou a été tué par un signal (129 et supérieur). 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 d'informations.

L'état de sortie d'un script shell est l'état de sortie de la dernière commande exécutée par le script. Donc par exemple

#!/bin/sh
somecommand

renvoie l'état de sortie de somecommand, tandis que

#!/bin/sh
somecommand
exit 0

renvoie 0 quel que soit le résultat somecommand. Ce deuxième script pourrait également être écrit

#!/bin/sh
somecommand
true

Mettre exit 0à la fin d'un script ne le fait pas nécessairement renvoyer 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 script suivant renvoie également toujours un code d'erreur, en plus d'afficher un message sur 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, car set -eprovoque la fermeture du script en cas d' somecommandéchec:

#!/bin/sh
set -e
somecommand
exit 0
Gilles 'SO- arrête d'être méchant'
la source