FreeToGenerate.com

Saisissez le nombre que votre journal vous a donné. Rien n'est envoyé.

Le nombre qu'un programme a renvoyé, ou celui qu'affiche votre journal d'intégration continue ou votre moteur de conteneurs.

Les plus courants

  • Défini par: Manuel de Bash

    Le programme a été tué par un signal ; il ne s'est pas arrêté de lui-même.

    SIGKILL

    Quel signal porte ce numéro, selon l'architecture

    x86 et la plupart des Linux
    SIGKILL
    Alpha et SPARC
    SIGKILL
    MIPS
    SIGKILL
    PA-RISC
    SIGKILL
    macOS
    SIGKILL
  • Défini par: Aucune norme

    Quoi qu'en dise n'importe quel tableau, c'est le programme qui a choisi ce nombre, et c'est sa documentation qui en fixe le sens.

Quelle part de la plage est réellement spécifiée

Comptée sur les 256 valeurs qu'un processus peut renvoyer, en demandant pour chacune si POSIX, le manuel de Bash ou sysexits.h en disent quelque chose.

Doté d'un sens par un document
50
Laissé entièrement au programme
206

Ce qu'un 1 veut vraiment dire pour les outils que vous enchaînez

La convention que tout le monde a en tête veut qu'une valeur non nulle signale une casse. Les deux utilitaires les plus présents dans un tube la contredisent, et tous deux réservent un autre nombre aux vraies erreurs. C'est pourquoi un simple set -e peut arrêter un script sur une réponse parfaitement ordinaire.

OutilCodeSignification
grep1Rien ne correspond. Ce n'est pas une erreur.
grep2Une vraie erreur.
diff1Les entrées diffèrent. Ce n'est pas une erreur.
diff2Une vraie erreur.
cmp1Les entrées diffèrent. Ce n'est pas une erreur.
ls2Une vraie erreur.

Les codes de sysexits.h, de 64 à 78

Ils sont présentés partout comme les codes de sortie normalisés. Ils n'ont jamais fait partie de POSIX, ils ont été écrits pour sendmail, et l'en-tête qui les définit les qualifie lui-même d'obsolètes et décrit leur sens comme approximatif. Utilisez-les si un programme avec lequel vous travaillez le fait déjà ; ne les choisissez pas en comptant sur l'accord de qui que ce soit d'autre.

CodeNomSignification
64EX_USAGEMal utilisé : mauvais nombre d'arguments, option incorrecte, syntaxe fautive dans un paramètre.
65EX_DATAERRLes données fournies étaient incorrectes. Pour les données de l'utilisateur, pas pour les fichiers système.
66EX_NOINPUTUn fichier d'entrée n'existait pas ou n'a pas pu être lu.
67EX_NOUSERL'utilisateur indiqué n'existe pas.
68EX_NOHOSTL'hôte indiqué n'existe pas.
69EX_UNAVAILABLEUn service est indisponible. L'en-tête le propose aussi comme fourre-tout quand quelque chose n'a pas marché sans qu'on sache pourquoi.
70EX_SOFTWAREUne erreur interne, sans rapport avec le système d'exploitation.
71EX_OSERRUne erreur du système, par exemple l'impossibilité de faire un fork ou de créer un tube.
72EX_OSFILEUn fichier système manque, ne s'ouvre pas ou est mal formé.
73EX_CANTCREATUn fichier de sortie n'a pas pu être créé.
74EX_IOERRUne erreur pendant la lecture ou l'écriture d'un fichier.
75EX_TEMPFAILUn échec temporaire. L'en-tête précise que ce n'est pas vraiment une erreur et qu'il faut réessayer.
76EX_PROTOCOLL'autre extrémité a envoyé quelque chose d'impossible pendant un échange.
77EX_NOPERMPermission refusée, au sens des autorisations de haut niveau et non de celles du système de fichiers.
78EX_CONFIGQuelque chose ne va pas dans la configuration.

Aussi disponible en : English · Español · Português · العربية

Les codes de sortie expliqués

Cherchez un code de sortie Unix et voyez toutes les lectures qu'il admet, et quel document appuie chacune d'elles.

Qu'est-ce qu'un code de sortie ?

Quand un programme se termine, il remet au système un unique nombre compris entre 0 et 255. Zéro signifie qu'il a réussi. Toute autre valeur signifie qu'il a échoué, et c'est à peu près tout ce qui est garanti. Le shell conserve ce nombre dans la variable qui s'écrit avec un point d'interrogation, les systèmes d'intégration continue l'affichent quand une étape échoue, et les moteurs de conteneurs le rapportent quand quelque chose s'arrête.

Presque tous les tableaux de codes de sortie du web présentent une seule liste plate — 0 succès, 1 erreur générale, 2 mauvais usage des primitives, 64 à 78 pour sysexits, 126, 127, 128 plus le numéro de signal — comme si une norme unique disait tout cela. À lire les documents réels, ces lignes viennent de quatre endroits différents, et l'une des plus citées ne vient de nulle part. Cette page décode un code et indique, pour chaque lecture, quel document la soutient.

La distinction n'est pas de la pédanterie. C'est la différence entre une règle qu'un autre programme respectera et une habitude simplement répandue dans le coin du monde où vous l'avez apprise.

Comment l'utiliser

  1. Saisissez le nombre. Celui qu'a affiché votre journal d'intégration continue, votre moteur de conteneurs ou votre shell. Les boutons couvrent ceux que l'on rencontre le plus souvent.
  2. Lisez toutes les lectures, pas seulement la première. Un même nombre peut être plusieurs choses à la fois : 64 est à la fois un code sysexits et un nombre quelconque qu'un programme a choisi pour ses propres raisons, et n'en montrer qu'une serait affirmer ce que les sources ne disent pas.
  3. Regardez qui le définit. Chaque lecture porte une étiquette : POSIX, manuel de Bash, sysexits.h, ou aucune norme. C'est cette étiquette qui mérite d'être retenue.

Quels nombres sont réellement spécifiés

POSIX, dans son chapitre sur le langage du shell, fixe très peu de choses : zéro pour le succès, 127 lorsqu'une commande est introuvable, et 126 lorsqu'elle est trouvée mais ne peut pas être exécutée. Ces trois-là valent partout. Pour un programme tué par un signal, il dit seulement que le code sera supérieur à 128 et identifiera le signal d'une manière définie par l'implémentation ; il ne dit pas 128 plus le numéro du signal.

Ce dernier point surprend, car 128 plus le numéro du signal est exactement ce qui se produit. Cela figure dans le manuel de Bash et non dans POSIX : bash indique que lorsqu'une commande se termine sur un signal fatal N, il utilise 128+N. Mesuré ici avec bash, dash et le shell du système, les trois ont concordé : un processus tué par SIGTERM a renvoyé 143, par SIGKILL 137, par SIGINT 130 et par SIGHUP 129. C'est fiable en pratique, et c'est la promesse d'un shell, pas celle de la norme.

Bash définit aussi le 2, mais bien plus étroitement que ne le laissent croire les tableaux : toutes ses primitives renvoient 2 pour signaler un usage incorrect, par exemple une option invalide ou un argument manquant. C'est un fait au sujet des primitives de bash. Ce n'est pas un conseil sur ce que votre script devrait renvoyer, et rien n'oblige un autre programme à s'y conformer.

Et puis il y a le 1, le code de sortie le plus tabulé d'internet, légendé partout erreur générale. Aucun document ne le définit. POSIX et le manuel de Bash disent uniquement qu'une valeur non nulle signale un échec. Sur les 256 valeurs possibles, un document dit quelque chose de 50 d'entre elles ; les 206 autres sont laissées entièrement au programme.

Deux choses que les tableaux racontent mal

La première est sysexits. Les codes de 64 à 78 sont présentés partout comme les codes de sortie normalisés, et ils n'ont jamais fait partie de POSIX. Ils viennent d'un en-tête C écrit pour sendmail, et cet en-tête est remarquablement franc sur lui-même : il dit que les valeurs n'existent que pour la compatibilité d'interface et sont obsolètes pour les logiciels de base de FreeBSD, qu'elles ont été écrites pour sendmail en particulier et — juste avant de les énumérer — que le sens des codes est approximativement le suivant. Un jeu de constantes dont l'auteur qualifie lui-même les significations d'approximatives est une convention raisonnable au sein d'un projet qui l'emploie déjà, et un mauvais pari si vous attendez du programme d'un inconnu qu'il la respecte.

La seconde est que 128 plus un numéro de signal n'identifie pas toujours un signal. Remonter du code au signal suppose de savoir quel signal porte ce numéro, et les numéros de signaux ne sont pas les mêmes partout. Sous Linux sur x86, le signal 10 est SIGUSR1 ; sur Alpha, SPARC et macOS, c'est SIGBUS. Le code 138 désigne donc un signal utilisateur sur une machine et une erreur de bus sur une autre, et aucun tableau imprimant un seul nom ne peut avoir raison dans les deux cas. Saisissez 138 ci-dessus et l'outil vous montre la division au lieu de trancher à votre place.

Il y a un piège plus petit dans l'autre sens. Le code tient sur huit bits, donc renvoyer davantage repart silencieusement à zéro : exit 256 arrive comme 0, ce qui transforme un échec en succès. Mesuré ici, exit 300 est revenu à 44 et exit 257 à 1. Les valeurs négatives sont pires qu'un simple débordement : bash a transformé -1 en 255, tandis que dash l'a refusé avec un message de nombre illégal et a renvoyé 2 — le même script signale donc deux échecs différents selon le shell qui l'exécute.

Pourquoi non nul ne veut pas dire cassé

La convention que chacun transporte veut que zéro aille bien et que tout le reste soit un problème. Les deux utilitaires les plus présents dans un tube la contredisent. grep renvoie 1 lorsqu'il n'a tout simplement rien trouvé, et réserve le 2 à une véritable erreur. diff renvoie 1 lorsque les fichiers diffèrent, ce qui est la réponse normale à la question posée, et réserve lui aussi le 2. cmp fait de même.

C'est la raison pratique pour laquelle l'avertissement au bas de chaque résultat de cette page compte. Un script sous set -e s'arrêtera sur un grep qui n'a rien trouvé, car le shell ne distingue pas une réponse négative d'un échec : les deux valent 1. Savoir lesquels de vos outils emploient le 1 comme réponse plutôt que comme erreur est plus utile que n'importe quel tableau de codes normalisés, parce que c'est le cas qui mord vraiment.

Si vous choisissez des codes pour votre propre programme : zéro pour le succès, non nul pour l'échec, et documentez ce que signifie chaque nombre. C'est là tout le contrat portable. Si vous voulez davantage de structure, choisissez un schéma et écrivez-le, car celui qui lira votre code de sortie n'a aucun moyen de le consulter.

Pourquoi est-ce gratuit ?

Ce n'est qu'une table de correspondance et un peu d'arithmétique, exécutées dans votre navigateur. Il n'y a rien à faire tourner sur un serveur, donc rien à facturer et aucun compte à créer.

Rien de ce que vous saisissez n'est envoyé, conservé ni journalisé — et il n'y aurait pas grand-chose à journaliser : l'entrée est un nombre compris entre 0 et 255.