164 votes

Pourquoi 0 est vrai mais faux est 1 dans la coquille?

 false; echo $?
 

Ce qui précède produira 1 , ce qui est contradictoire avec tous les autres langages de programmation que je connais.

Une raison à cela?

116voto

Stefan Lasiewski Points 2627

Bash est un programme (script) de la langue, mais c'est aussi une coquille et une interface utilisateur. Si 0 a erreur, le programme pourrait ne présentent qu'un seul type d'erreur.

Cependant, en Bash, toute valeur différente de zéro est une erreur, et nous pouvons utiliser n'importe quel nombre de 1 à 255 pour représenter une erreur. Cela signifie que nous pouvons avoir beaucoup de différents types d'erreurs. 1 est une erreur générale, 126 signifie qu'un fichier ne peut pas être exécutée, 127 signifie "command not found", etc. Voici une liste de Bash Réservés Codes de Sortie montrant la plupart des codes de sortie.

Il y a aussi de nombreux types de succès (état de sortie est - 0). Cependant, un succès vous permettra de procéder à la prochaine étape, vous pouvez comme d'imprimer des résultats sur un écran, ou d'exécuter une commande, etc.

106voto

Carl Norum Points 114072

C'est une convention, mais particulièrement utile lorsque vous pensez à ce sujet. En général, si un programme réussit, c'est tout ce que vous devez savoir. Si elle échoue, cependant, vous pourriez avoir besoin de savoir toutes sortes d'informations à propos de la panne - pourquoi c'est arrivé, comment le réparer, etc. Avoir de moyenne nulle, la "réussite" et non nul synonyme d'échec vous permet de vérifier assez facilement pour la réussite, et d'enquêter sur l'erreur pour plus de détails si vous le souhaitez. Beaucoup d'Api et de cadres ont une convention similaire - fonctions qui réussissent return 0 et et ceux qui échouent à donner en retour un code d'erreur décrivant le particulier en cas d'échec.

21voto

Philippe A. Points 951

Un point fondamental, je trouve important de comprendre cela. En bash et en shells unix en général, les valeurs de retour ne sont pas de type boolean. Ils sont des entiers codes de sortie. En tant que tel, vous devez les évaluer en fonction de la convention en disant: 0 synonyme de réussite, et d'autres valeurs à une certaine erreur.

Avec test, [ ] ou [[ ]] opérateurs, bash conditions évaluent aussi vrai dans le cas d'un code de sortie 0 (le résultat de /bin/true). Sinon, ils évaluent la valeur false.

Les chaînes sont évalués différemment des codes de sortie:

if [ 0 ] ; then echo not null ; fi
if [ $(echo 0) ] ; then echo not null ; fi

if [ -z "" ] ; then echo null ; fi

L' (( )) opérateur arithmétique interprète 1 et 0 comme le vrai et le faux. Mais que l'opérateur ne peut être utilisé comme un remplacement complet pour l' test, [ ] ou [[ ]]. Voici un exemple montrant lorsque l'opérateur arithmétique est utile:

for (( counter = 0 ; counter < 10 ; counter ++ )) ; do
  if (( counter % 2 )) ; then echo "odd number $counter" ; fi
done

15voto

Matthew Flaschen Points 131723

C'est juste une convention, un code de sortie 0 synonyme de réussite. EXIT_SUCCESS sera de 0 sur presque tous les systèmes modernes.

EDIT:

"pourquoi tant de test de 0 et de 1 test renvoie la valeur 0(succès) ?"

C'est une toute autre question. La réponse est que le passage d'un argument unique de test toujours les résultats de succès, à moins que cet argument est une chaîne vide (""). Voir le Groupe Ouvert de la documentation.

12voto

Michael Mrozek Points 44120

Généralement, les programmes renvoient zéro en cas de succès, non nul en cas d'échec; false renvoie 1 car il s'agit d'une valeur pratique non nulle, mais toute valeur autre que zéro est généralement synonyme d'échec, et de nombreux programmes renvoient différentes valeurs non nulles pour indiquer différents modes d'échec.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X