Basierend auf den Antworten, die ich erhalten habe (es war schwierig, eine über die anderen zu wählen), ist es nicht schädlich , bestimmte Arten von Fehlern durch die Verwendung eines Exit-Codes anzuzeigen, den Bash auch verwendet. Bash (oder eine andere Unix-Shell) führt keine besonderen Aktionen aus (z. B. das Ausführen von Ausnahmehandlern), wenn ein Benutzerskript mit einem dieser Fehlercodes beendet wird.
Es scheint, dass der Autor des Advanced Bash-Scripting Guide den BSD-Versuchen zur Standardisierung von Exit-Codes ( sysexits.h
) zustimmt und einfach empfiehlt, dass Benutzer beim Schreiben von Shell-Skripten keine Exit-Codes angeben, die bereits mit vordefinierten Exit-Codes in Konflikt stehen im Einsatz, dh, sie beschränken ihre benutzerdefinierten Beendigungscodes auf die 50 verfügbaren Statuscodes im Bereich von 64 bis 113.
Ich schätze die Idee (und das Grundprinzip), aber ich hätte es vorgezogen, wenn der Autor expliziter gesagt hätte, dass es nicht schädlich ist, den Rat zu ignorieren - abgesehen von Fällen, in denen der Konsument eines Skripts nach Fehlern sucht, wie im zitierten Beispiel von 127 ( command not found
).
Relevante POSIX-Spezifikationen
Ich habe nachgeforscht, was POSIX über Exit-Codes zu sagen hat, und die POSIX-Spezifikation scheint mit dem Autor des Advanced Bash-Scripting Guide übereinzustimmen. Ich habe die relevanten POSIX-Spezifikationen zitiert (Schwerpunkt meine):
Beenden Sie den Status für Befehle
Jeder Befehl hat einen Exit-Status, der das Verhalten anderer Shell-Befehle beeinflussen kann. Der Beendigungsstatus von Befehlen, die keine Dienstprogramme sind, wird in diesem Abschnitt dokumentiert. Der Beendigungsstatus der Standarddienstprogramme ist in den entsprechenden Abschnitten dokumentiert.
Wenn ein Befehl nicht gefunden wird, lautet der Beendigungsstatus 127. Wenn der Befehlsname gefunden wird, es sich jedoch nicht um ein ausführbares Dienstprogramm handelt, lautet der Beendigungsstatus 126. Anwendungen, die Dienstprogramme aufrufen, ohne die Shell zu verwenden, sollten diese Beendigungsstatuswerte verwenden ähnliche Fehler zu melden.
Wenn ein Befehl während der Worterweiterung oder -umleitung fehlschlägt, muss sein Beendigungsstatus größer als Null sein.
Intern muss die Shell für die Entscheidung, ob ein Befehl mit einem Nicht-Null-Beendigungsstatus beendet wird, den gesamten Statuswert erkennen, der für den Befehl durch das Äquivalent des Makros wait () function WEXITSTATUS (wie im Volume System Interfaces von definiert) abgerufen wurde POSIX.1-2008). Wenn der Exit-Status mit dem speziellen Parameter "?" Gemeldet wird, meldet die Shell die vollen acht verfügbaren Bits des Exit-Status. Der Beendigungsstatus eines Befehls, der beendet wurde, weil er ein Signal empfangen hat, wird als größer als 128 gemeldet.
Das exit
Dienstprogramm
Wie in anderen Abschnitten erläutert, wurden bestimmte Exit-Statuswerte für spezielle Zwecke reserviert und sollten von Anwendungen nur für die folgenden Zwecke verwendet werden:
126
- Es wurde eine auszuführende Datei gefunden, die jedoch kein ausführbares Dienstprogramm ist.
127
- Ein auszuführendes Dienstprogramm wurde nicht gefunden.
>128
- Ein Befehl wurde durch ein Signal unterbrochen.
Weitere Informationen
Für das, was es wert ist, war ich in der Lage, alle bis auf einen der Exit-Codes mit speziellen Bedeutungen zu überprüfen . Diese Tabelle mit Exit-Codes ist nützlich, da sie weitere Details und Beispiele zum Generieren der in der Bash-Referenz dokumentierten Fehlercodes enthält .
Versuchen Sie, den Exit-Status 128 zu generieren
Mit den Bash-Versionen 3.2.25 und 4.2.46 habe ich versucht, einen 128 Invalid argument to exit
Fehler zu werfen , aber jedes Mal, wenn ich eine 255 erhalten habe (Exit-Status außerhalb des gültigen Bereichs). Wird exit 3.14159
die Shell beispielsweise als Teil eines Shell-Skripts oder in einer interaktiven untergeordneten Shell ausgeführt, wird die Shell mit dem folgenden Code beendet 255
:
$ exit 3.14159
exit
bash: exit: 3.14159: numeric argument required
Um noch mehr Spaß zu haben, habe ich auch versucht, ein einfaches C-Programm auszuführen. In diesem Fall hat die exit(3)
Funktion den float-Wert einfach vor dem Beenden in einen int-Wert (in diesem Fall 3) konvertiert:
#include <stdlib.h>
main()
{
exit(3.14159);
}