Existe-t-il un moyen de faire ce qui est indiqué dans le titre à partir des commandes du terminal, ou vais-je devoir examiner les codes?
command
documentation
exit
précis
la source
la source
Les codes de sortie indiquent une condition d'échec à la fin d'un programme et ils se situent entre 0 et 255. Le shell et ses commandes internes peuvent utiliser en particulier les valeurs supérieures à 125 pour indiquer des modes de défaillance spécifiques, donc la liste des codes peut varier entre les shells et les systèmes d'exploitation (par exemple Bash utilise la valeur 128 + N comme état de sortie). Voir: Bash - 3.7.5 Exit Status ou
man bash
.En général, un état de sortie zéro indique qu'une commande a réussi , un état de sortie différent de zéro indique un échec .
Pour vérifier quel code d'erreur est retourné par la commande, vous pouvez imprimer
$?
pour le dernier code de sortie ou${PIPESTATUS[@]}
qui donne une liste des valeurs d'état de sortie du pipeline (dans Bash) après la fermeture d'un script shell.Il n'y a pas de liste complète de tous les codes de sortie qui peuvent être trouvés, mais il y a eu une tentative de systématiser les numéros de statut de sortie dans la source du noyau, mais c'est principalement destiné aux programmeurs C / C ++ et une norme similaire pour les scripts pourrait être appropriée.
Une liste de sysexits sur Linux et BSD / OS X avec des codes de sortie préférables pour les programmes (64-78) peut être trouvée dans
/usr/include/sysexits.h
(ou:man sysexits
sur BSD):La liste ci-dessus attribue les codes de sortie précédemment inutilisés de 64 à 78. La gamme de codes de sortie non attribués sera encore limitée à l'avenir.
Cependant, les valeurs ci-dessus sont principalement utilisées dans sendmail et utilisées par à peu près personne d'autre, elles ne sont donc pas à distance proches d'un standard (comme indiqué par @Gilles ).
Dans le shell, l'état de sortie est le suivant (basé sur Bash):
1
-125
- La commande ne s'est pas terminée avec succès. Consultez la page de manuel de la commande pour connaître la signification de l'état, quelques exemples ci-dessous:1
- Catchall pour les erreurs généralesExemple:
2
- Utilisation abusive des commandes internes de shell (selon la documentation de Bash)Exemple:
6
- Aucun appareil ou adresseExemple:
124
- la commande expire125
- si une commande elle-même échoue, voir: coreutils126
- si la commande est trouvée mais ne peut pas être invoquée (par exemple n'est pas exécutable)Exemple:
127
- si une commande est introuvable, le processus enfant créé pour l'exécuter renvoie cet étatExemple:
128
- Argument non valide pourexit
Exemple:
128
-254
- signal d'erreur fatale "n" - la commande est morte suite à la réception d'un signal. Le code du signal est ajouté à 128 (128 + SIGNAL) pour obtenir le statut (Linuxman 7 signal
:, BSD:)man signal
, quelques exemples ci-dessous:130
- commande terminée en raison de la pression sur Ctrl-C, 130-128 = 2 (SIGINT)Exemple:
137
- si la commande est envoyée leKILL(9)
signal (128 + 9), l'état de sortie de la commande sinon141
-SIGPIPE
- écrire sur une pipe sans lecteurExemple:
143
- commande terminée par le code de signal 15 (128 + 15 = 143)Exemple:
255
* - statut de sortie hors plage.Exemple:
Veuillez noter que les valeurs de sortie hors limites peuvent entraîner des codes de sortie inattendus (par exemple, la sortie 3809 donne un code de sortie de 225, 3809% 256 = 225).
Voir:
la source
errno
Les valeurs sont utilisées par les API système, elles ne sont pas utilisées comme états de sortie (elles ne sont même pas dans la bonne plage) et elles ne sont pas pertinentes pour les scripts shell. Les valeurs des sysexits proviennent de sendmail et sont utilisées par quasiment personne d'autre, elles ne sont pas du tout proches d'un standard.Vous devrez examiner le code / la documentation. Cependant, la chose qui se rapproche le plus d'une "standardisation" est errno.h
la source
errno.h
n'est pas pertinent pour les codes de sortie, seuls les messages d'erreur.sysexits.h
. Cependant, certains programmes renvoient deserrno
s, et je pense que retourner deserrno
s est le plus logique. Leserrno
s non gérés se propagent vers le haut, comme les exceptions, (leserrno
séjours, les fonctions renvoient par exemple,-1
ou0|NULL
). Étant donné que les programmes ne sont que des fonctions, bien que des fonctions exécutées dans un espace d'adressage distinct, il est logique qu'un programme souhaite continuer laerrno
propagation à travers la frontière du processus."($numeric_code|$bsd_decoded|$errno_plus_one_decoded)"
.Pour autant que je sache, il n'y a que deux valeurs standard, plus ou moins, toutes deux définies
stdlib.h
pour une utilisation avec exit ():Et la seule valeur standard de facto, c'est-à-dire ayant la même signification pour tous les programmes dans le monde, est 0 (zéro) qui signifie SUCCÈS.
Différents programmes introduisent différentes listes de codes "d'échec" renvoyés pour distinguer ou souligner différentes erreurs (différents types ou gravité). Certains programmes utilisent même la valeur renvoyée pour signaler le nombre entier d'erreurs d'exécution découvertes (par exemple, le nombre de tests unitaires ayant échoué dans la combinaison).
Je ne recommanderais pas d’introduire une quelconque "nouvelle norme" étendant la
stdlib.h
la source