Hier gibt es zwei verwandte Probleme.
Zunächst die Frage des OP: Warum ist 0 wahr, aber falsch ist 1 in der Shell? und zweitens, warum geben Anwendungen 0 für Erfolg und ungleich Null für Fehler zurück?
Um die Frage des OP zu beantworten, müssen wir die zweite Frage verstehen. Die zahlreichen Antworten auf diesen Beitrag haben beschrieben, dass dies eine Konvention ist, und einige der Feinheiten aufgelistet, die diese Konvention bietet. Einige dieser Feinheiten sind unten zusammengefasst.
Warum geben Anwendungen 0 für Erfolg und ungleich Null für Fehler zurück?
Code, der eine Operation aufruft, muss zwei Dinge über den Beendigungsstatus der Operation wissen. Wurde die Operation erfolgreich beendet? [* 1] Und wenn die Operation nicht erfolgreich beendet wurde, warum wurde die Operation nicht erfolgreich beendet? Jeder Wert kann verwendet werden, um den Erfolg anzuzeigen. 0 ist jedoch bequemer als jede andere Zahl, da es zwischen Plattformen portierbar ist. Zusammenfassung der Antwort von xibo auf diese Frage am 16. August 2011:
Null ist codierungsunabhängig.
Wenn wir eins (1) in einem 32-Bit-Ganzzahlwort speichern wollten, wäre die erste Frage "Big-Endian-Wort oder Little-Endian-Wort?", Gefolgt von "Wie lange bilden die Bytes ein Little-Endian-Wort?" ", während Null immer gleich aussieht.
Es muss auch erwartet werden, dass einige Leute errno irgendwann zu char oder short werfen oder sogar schweben. (int) ((char) ENOLCK) ist nicht ENOLCK, wenn char nicht mindestens 8 Bit lang ist (7-Bit-ASCII-Zeichenmaschinen werden von UNIX unterstützt), während (int) ((char) 0) unabhängig von 0 ist architektonische Details von char.
Sobald festgestellt wurde, dass 0 der Rückgabewert für den Erfolg ist, ist es sinnvoll, einen Wert ungleich Null für den Fehler zu verwenden. Auf diese Weise können viele Exit-Codes die Frage beantworten, warum der Vorgang fehlgeschlagen ist.
Warum ist 0 wahr, aber falsch ist 1 in der Shell?
Eine der grundlegenden Anwendungen von Shells besteht darin, Prozesse durch Skripterstellung zu automatisieren. Normalerweise bedeutet dies, eine Operation aufzurufen und dann abhängig vom Exit-Status der Operation etwas anderes zu tun. Philippe A. hat in seiner Antwort auf diesen Beitrag das gut erklärt
In Bash- und Unix-Shells im Allgemeinen sind Rückgabewerte nicht boolesch. Sie sind ganzzahlige Exit-Codes.
Es ist dann notwendig, den Exit-Status dieser Operationen als booleschen Wert zu interpretieren. Es ist sinnvoll, einen erfolgreichen ( 0
) Exit-Status auf true und einen Nicht-Null- / Failure-Exit-Status auf false abzubilden . Auf diese Weise können verkettete Shell-Befehle bedingt ausgeführt werden.
Hier ist ein Beispiel mkdir deleteme && cd $_ && pwd
. Da die Shell 0 als wahr interpretiert, funktioniert dieser Befehl wie erwartet. Wenn die Shell 0 als falsch interpretieren würde, müssten Sie den interpretierten Exit-Status für jede Operation invertieren.
Kurz gesagt, es wäre unsinnig für die Shell, 0 als falsch zu interpretieren, da Anwendungen 0 für einen erfolgreichen Exit-Status zurückgeben.
[* 1]: Ja, häufig müssen Vorgänge mehr als nur eine einfache Erfolgsmeldung zurückgeben, aber das würde den Rahmen dieses Threads sprengen.
Siehe auch Anhang E im Advanced Bash-Scripting Guide