Pourquoi 0 est vrai, mais faux est de 1 dans le shell?
false; echo $?
Ci-dessus seront de sortie 1
, ce qui est contradictoire avec tous les autres langages de programmation, je sais.
Raison?
- C'est également dans la ligne de la Manière Unix... ne rien retourner sur la réussite.
- Parce qu'une sortie de statut n'est pas un booléen. Simple que cela.
- Gardez à l'esprit que
false
n'est pas un booléen, comme dans d'autres langages de programmation. C'est juste un programme situé à/bin/false
(/usr/bin/false
sur un Mac) qui doit toujours retourner une erreur de code de sortie 1. Similaire pourtrue
. Donc il n'y a pas une telle chose comme la coulée ici. C'est juste tout sur les codes de sortie.
Vous devez vous connecter pour publier un commentaire.
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.
Bash est un programme (script) de la langue, mais c'est aussi une coquille et une interface utilisateur. Si
0
était d'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 Codes De Sortie Avec Une Signification Particulière montrant la plupart des codes de sortie.Il ya 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./usr/include/sysexits.h
les notes de sortie les valeurs de qui sont peut-être plus ambitieux, même si la convention qu'ils représentent remonte aux années 1980. Cette convention existe en dehors du champ d'application de bash.0
était d'erreur, alors le programme ne pourrait présenter un type de l'erreur". Cette déclaration est la clé, et la raison pour laquelle cette réponse devrait être au top.Il y a deux problèmes ici.
Tout d'abord, l'OP question, Pourquoi 0 est vrai, mais faux est de 1 dans le shell? et la deuxième, pourquoi ne demandes de retour à 0 pour la réussite et non nulle pour défaut?
Pour répondre à l'OP de la question, nous avons besoin de comprendre à la seconde question. Les nombreuses réponses à ce post ont indiqué que c'est une convention et ont énuméré certaines des subtilités de cette convention offre. Certains de ces subtilités sont résumées ci-dessous.
Pourquoi ne demandes de retour à 0 pour la réussite et non nulle pour défaut?
Code qui appelle une opération a besoin de savoir deux choses sur le statut de sortie de l'opération. Fait l'opération de sortie avec succès? [*1] Et si l'opération n'est pas sortie avec succès pourquoi l'opération de sortie sans succès? Toute valeur peut être utilisée pour désigner succès. Mais 0 est plus pratique que n'importe quel autre nombre, car il est portable entre les plates-formes. Résumant xibo, la réponse à cette question le 16 Août 2011:
Une fois qu'il est déterminé que la valeur 0 sera la valeur de retour pour le succès, il est logique d'utiliser une valeur non nulle en cas d'échec. Cela permet de nombreuses codes de sortie pour répondre à la question de savoir pourquoi l'opération a échoué.
Pourquoi 0 est vrai, mais faux est de 1 dans le shell?
L'un des principaux usages de l'obus est d'automatiser les processus par les scripts. Habituellement, cela signifie que l'invocation d'une opération et ensuite de faire autre chose conditionnelle basée sur le statut de sortie de l'opération. Philippe A. bien expliqué dans sa réponse à ce post que
Il est nécessaire ensuite d'interpréter le statut de sortie de ces opérations comme une valeur booléenne. Il fait sens pour mapper un succès (
0
) état de sortie de vrai et non-zéro/erreur de sortie d'état false. Ceci permet l'exécution conditionnelle de chaînée des commandes shell.Voici un exemple
mkdir deleteme && cd $_ && pwd
. Parce que le shell interprète 0 conforme cette commande commodément fonctionne comme prévu. Si la coque ont été à interpréter 0 à faux, alors vous auriez à inverser le interprétée statut de sortie pour chaque opération.En bref, il serait absurde pour le shell pour interpréter 0 à faux compte tenu de la convention que les demandes de retour de 0 pour une sortie de crise réussie d'état.
[*1]: Oui, de nombreuses fois les opérations besoin de retourner plus qu'un simple message de succès mais qui est au-delà de la portée de ce fil.
Voir aussi L'Annexe E dans l'Advanced Bash Scripting Guide
mkdir deleteme && cd _$ && pwd
ne serait pas vraiment échouer; mais il faudrait le remplacer parmkdir deleteme || cd _$ || pwd
, qui à mon avis est beaucoup moins clair, parce que ce que nous voulons faire est demkdir deleteme
“et”cd _$
“et”pwd
... (avec “et” avoir ici sa signification dans le langage ordinaire).&&
opérateurs avec||
opérateurs. Vous devez appliquer pleinement De Morgan, de la loi. Voir: en.wikipedia.org/wiki/De_Morgan%27s_lawstrue
correspond à zéro etfalse
correspond à zéro. Tout d'abord, si je vous dis quelque chose, avoir “dit la vérité” dépend du nombre de mensonges que j'ai dit: soit c'est nul et j'ai dit (dans le monde) la vérité, ou il est différent de zéro et j'ai menti. C'est essentiellement le même de vouloir la logiqueand
pour correspondre à la commune “et” de plus (quand limitant aux nombres naturels, évidemment).true
et toutes les autres valeurs pourfalse
. (C'est essentiellement le même que les considérations sur les valeurs de retour des programmes).true
se comporte comme multiplicatif 1 etfalse
comme multiplicatif -1. Qui, comme les pouvoirs de -1 signifie quetrue
se comporte de plus en tant que “même” etfalse
comme “bizarre”. Encore une fois, il esttrue
qui mérite d'être nul...true
serait 1 etfalse
serait de 0! Les commentaires précédents étaient juste à souligner que, d'autre part, le choix n'est pas évident encore.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) ?"
Qui 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 la Groupe ouvert de la documentation.
test 0
ettest 1
renvoie 0(succès) ?man test
pour plus d'informations.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 comme faux.Chaînes sont évalués différemment des codes de sortie:
La
(( ))
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 pourtest
,[ ]
ou[[ ]]
. Voici un exemple montrant lorsque l'opérateur arithmétique est utile:Généralement des programmes de retour à zéro pour le succès, non nulle pour défaut;
false
retourne 1 car c'est une pratique non-valeur zéro, mais en général, toute valeur non nulle est l'échec d'une certaine sorte, et de nombreux programmes différents retour des valeurs non nulles pour indiquer les différents modes de défaillanceAutant que je sache, cela viennent de la convention C que tu doit retourner 0 si réussi.
Voir:
La plupart de la C POSIX () de l'api est l'accumulation de ce genre.
http://en.wikipedia.org/wiki/C_POSIX_library
De votre tentative d'assimiler vrai/faux avec succès/échec.
Ils sont deux totalement, bien que subtilement au premier abord, les différentes dichotomies!
Dans les scripts shell, il n'y a pas une telle chose comme vrai/faux. Coque "expressions" ne sont pas interprétés comme des vrai/faux. Plutôt, shell 'expressions' sont des processus qui réussissent ou échouent.
De toute évidence, un processus peut échouer pour de nombreuses raisons. Donc nous avons besoin d'un plus grand ensemble de codes de carte possible échecs. Les entiers positifs faire l'affaire. D'autre part, si l'opération réussit, ce qui signifie qu'il a fait exactement ce qu'il était censé faire. Puisqu'il n'y a qu'une seule façon de le faire, nous avons seulement besoin d'un code. 0 est le tour est joué.
En C, nous allons créer un programme. Dans un script shell, nous avons un tas de programmes pour obtenir quelque chose.
Différence!
d'une convention datant des premiers jours de Unix.
Par convention, tous les appels système renvoient 0 si réussir, des non-zéro autrement, parce que les nombres différents peuvent être utilisés pour indiquer les différentes raisons de l'échec.
Coquilles de suivre cette convention, 0 signifie que la dernière commande a réussi, non nulle sinon. De même, la non-zéro de la valeur de retour est très pratique pour la sortie des messages d'erreur: par exemple, 1: "mort cérébrale", 2: "sans cœur", et ainsi de suite.
Peut-être un bon moyen de se rappeler qu'il est :