web-dev-qa-db-fra.com

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

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

Que signifient exit 1, exit 0 et exit 2 et pourquoi les utilisons-nous?

37
andrej benedičič

Voici un bon 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.

52
user535733

Utiliser exit et un 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. exit fait également que votre script arrête l'exécution à ce moment-là et retourne à la ligne de commande.

Tout code de 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 de retour.

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

$ 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

Cela n'a aucun sens, car vous ne pouvez jamais atteindre la partie exit 0.

21
Arronical

Tout seul, exit implique 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 commande exit 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 de la commande exit, la réponse à echo $? serait dans tous les cas nulle.

Cependant, en spécifiant l'argument 1 de la commande exit, la réponse à echo $? 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.

4
geekasaurus