web-dev-qa-db-fra.com

Code de sortie à la fin d'un script bash

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?

23
Busted

La commande intégrée exit quitte le shell (depuis référence de Bash ):

exit [n]
Quittez le shell, en renvoyant un état n au parent du shell. Si n est omis, l'état de sortie est celui de la dernière commande exécutée. Toute interruption sur EXIT est exécutée avant la fin du shell.

L'exécution à la fin du fichier se ferme également, renvoyant le code retour de la dernière commande, donc oui, un exit 0 Final fera 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 le exit.) Final. À la fin d'un script, vous pouvez également utiliser true ou : Pour obtenir un code de sortie de zéro.

Bien sûr, plus souvent, vous utiliserez exit depuis l'intérieur d'un if pour 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 exit est 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 renvoyés de la manière habituelle. L'appel système wait renvoie en fait une valeur plus large, le reste contenant des bits d'état définis par le système d'exploitation.

23
ilkkachu

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, alors que

#!/bin/sh
somecommand
exit 0

renvoie 0 indépendamment de ce que somecommand a renvoyé. Ce deuxième script pourrait également être écrit

#!/bin/sh
somecommand
true

En mettant 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 l'état de somecommand, puisque set -e provoque la fermeture du script si somecommand échoue:

#!/bin/sh
set -e
somecommand
exit 0