Signification de exit 0, exit 1 et exit 2 dans un script bash

49

Je fais des exercices pratiques.

Ecrivez un script qui se verra attribuer un numéro de mois et traduira ce numéro en un nom de mois. Le résultat sera imprimé sur la sortie standard.

J'ai fait une solution:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

Qu'est-ce que exit 1, exit 0et que exit 2signifie, et pourquoi les utilisons-nous?

andrej benedičič
la source
5
Un code exécuté avec succès doit sortir avec le code 0. Les autres valeurs indiquent une erreur. Voir, par exemple, Codes de sortie ayant une signification spéciale
V. Olsen
2
Un script bash est comme une salle de cinéma, il existe différentes. Les instructions de sortie indiquent l'emplacement des sorties pour l'interpréteur bash. Lorsque le script est lancé, l'interprète doit s'exécuter jusqu'à la sortie la plus proche.
DepressedDaniel
5
Si c'est le code que vous avez écrit, comment se fait-il que vous ayez utilisé des déclarations que vous ne comprenez même pas?
Dmitry Grigoryev
5
1) Vous avez accepté une réponse juste après avoir posté la question. Donnez-lui 24 heures pour attendre des réponses encore meilleures. 2) La réponse acceptée est fausse et trompeuse. La réponse correcte est "il n'y a pas de signification par défaut pour les codes de sortie (au-delà de 0 = succès); vous en tant que développeur de script définissez la sémantique". 3) Si vous avez créé ce script, pourquoi avez-vous ajouté les commandes de sortie (qui sont toutes logiquement superflues ou qui pourraient se réduire à "exit 1" puisque vous utilisez de toute façon if-else).
AnoE

Réponses:

58

Voici une bonne référence pour les codes de sortie du shell :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

Avertissement: L'utilisation du code de sortie approprié n'est pas une exigence et n'est pas appliquée par le shell. Les développeurs peuvent ignorer les instructions s’ils le jugent judicieux.

utilisateur535733
la source
8
Soyez prudent, cependant. Ce qu’un code de sortie signifie, c’est entièrement aux développeurs du programme.
muru
De plus, alors que la source liée, le Guide de script Bash avancé, prétend afficher des " codes de sortie réservés " (italiques dans l'original), cette revendication est à la fois non cuite et entièrement fausse .
Eliah Kagan
23

L'utilisation d' exitun nombre est un moyen pratique de signaler le résultat de votre script. Il imite la façon dont les commandes bash génèrent un code de retour. Avec les commandes bash, le code de retour 0 signifie généralement que tout s’exécute avec succès sans erreur. exitoblige également votre script à arrêter l'exécution à ce moment-là et à revenir à la ligne de commande.

Tout code retour supérieur à 0 indique une erreur quelconque, bien que parfois l'erreur ne soit pas critique, pour chaque commande, il devrait être possible de trouver une documentation qui vous indique la signification de chaque code retour.

Vous pouvez obtenir le code de retour de la dernière commande bash en utilisant la variable shell $?comme ceci:

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

Lorsque vous utilisez cela dans un script, vous pouvez interroger le code de retour de la même manière, une fois l'exécution terminée. Donc, vous verrez cela avoir:

exit 2
exit 0

Est en quelque sorte sans signification, comme vous ne pouvez jamais atteindre la exit 0partie.

Arronique
la source
3

Tout seul, exitimplique une valeur de sortie égale à zéro ou la réussite de votre script. Il n'est pas nécessaire d'ajouter l'argument zéro à la commande exit pour indiquer que l'opération a abouti. Votre script peut (ou sera probablement) quitter avec succès bien qu'il teste une condition erronée. Dans ce cas, vous voulez spécifiquement qu'il se termine avec la condition d'erreur (ou 1).

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

La exitcommande dans la dernière ligne ne doit pas nécessairement être là. Il pourrait être appelé avec le zéro ou pas appelé du tout. Sans spécifier l'argument 1 à la commande exit, la réponse à tous les cas echo $?serait zéro.

Cependant, en spécifiant l'argument 1 de la commande exit, la réponse à echo $?serait serait 1. Utilisez donc l'argument 1 de la commande exit lorsque vous souhaitez spécifier que le script s'est terminé avec une condition d'erreur.

geekasaurus
la source