Wie suche ich nach Exit-Codes für Anwendungen?

8

Ich habe Schwierigkeiten, eine umfassende, aktuelle Liste der Fehlercodes von Bash zu finden. z.B:

$ udevadm info /dev/sdx; echo Exit code $?
Unknown device, --name=, --path=, or absolute path in /dev/ or /sys expected.
Exit code 4

Wie soll man solche Exit-Codes nachschlagen?

Dave Rove
quelle
1
Es sollte beachtet werden , dass Ihr Beispiel udevadmist nicht ein Bash - Skript ...
jasonwryan
1
Wenn eine dieser Antworten Ihr Problem löst, nehmen Sie sich bitte eine Minute Zeit und klicken Sie auf das Häkchen unter der Stimmenzahl links. Dies bedeutet für alle, dass Ihr Problem behoben wurde, und ist die Art und Weise, wie auf der Website gedankt wird.
Terdon

Antworten:

11

tl; dr Exit-Codes sind anwendungsspezifisch.

Es gibt einige lose Konventionen. falseund alles, was in POSIX-Shells mit einem Präfix !(wie ! true) versehen ist, gibt den Exit-Code 1 zurück, aber ein Entwickler kann jeden Exit-Code zwischen 0 und 255 für alles verwenden, was er will. Letztendlich müssen Sie sich die Dokumentation (im besten Fall) oder den Code (im schlimmsten Fall) ansehen, um zu wissen, was dies bedeutet. Bei Programmen mit manSeiten werden Exit-Codes häufig in einem Abschnitt mit dem Namen EXIT STATUS(GNU-Tools wie find) aufgeführt.

Einige beliebte Bedeutungen sind in aufgeführt /usr/include/sysexits.h- ich versuche, sie wann immer möglich zu verwenden. Wie @AnsgarEsztermann hervorhebt , handelt es sich hierbei nicht um eine Bash-Referenz oder gar eine Anwendungsreferenz, außer für diejenigen, die sich für die Verwendung entscheiden (C / C ++ - Entwickler hauptsächlich gemäß ABS ).

l0b0
quelle
Aha. Danke l0b0 und jasonwryan. Ich komme daher zu dem Schluss, dass ein bestimmter Befehl nicht ordnungsgemäß dokumentiert ist.
Dave Rove
2
Falls dies aus der Antwort von l0b0 nicht klar geworden ist: Diese Exit-Codes sind keine "Bash-Exit-Codes". Sie gehören vollständig zu den vorhandenen Befehlen und ändern sich nicht, wenn diese Befehle auf eine andere Weise aufgerufen werden, die kein Bash beinhaltet.
Ansgar Esztermann
Die Werte in sysexits.hsind so gut wie unbenutzt, außer von procmailund Firma. Nur sendmail (und einige andere MTAs) kümmern sich um sie.
Gilles 'SO - hör auf böse zu sein'
12

Es gibt eine Handvoll Exit-Codes mit reservierten speziellen Bedeutungen :

Beenden Sie die Codenummer
1 Catchall für allgemeine Fehler
2 Missbrauch von Shell-Builtins (gemäß Bash-Dokumentation)
126 Der aufgerufene Befehl kann nicht ausgeführt werden
127 "Befehl nicht gefunden"
128 + n Schwerwiegendes Fehlersignal "n"
130 Skript mit Strg-C beendet
255 * Ausgangsstatus außerhalb des Bereichs

Alles unter 125 ist ein faires Spiel für Entwickler und kann wirklich nur durch Lesen der Seite für die Anwendung oder des Quellcodes erratenman werden, um festzustellen, was der Code bedeutet (wenn er tatsächlich dokumentiert ist) , wie 10b0 in seiner Antwort feststellt überhaupt).

Jasonwryan
quelle
2
Es sollte auch beachtet werden, dass diese nur durch Konvention "reserviert" sind - es gibt keine Durchsetzung (außer dem gesunden Menschenverstand), die tatsächlich verhindert, dass beispielsweise eine Anwendung verwendet 1oder 2gemeint ist success. Alles ist eigentlich ein faires Spiel für Entwickler.
niemand
Zum Erweitern sollten sie "für benutzerdefinierte Exit-Parameter [...] vermieden werden".
10.
@AndrewMedico Das ist nicht ganz richtig: 0 für den Erfolg ist nicht nur eine Frage der Konvention, es in eine Menge von Werkzeugen einschließlich Schalen gebaut ist ( &&, ||, !, set -e, ...).
Gilles 'SO - hör auf böse zu sein'
Die Einträge für 1 und 2 machen wenig Sinn. 1 und 2 sind nicht reserviert. Bash Builtins verwenden nicht immer 2 - tatsächlich scheinen sie 1 für Fehler zu verwenden; Andere Shells verwenden andere Fehlercodes (normalerweise 1 oder 2). "Fehlendes Schlüsselwort" und diffes geht nicht um Shell-Buildins. 1 und 2 sind beide gemeinsame Catchalls.
Gilles 'SO - hör auf böse zu sein'