Es hängt von der Umgebung ab, aber ich würde sagen, es ist ein schlechter Stil.
Unix-ähnliche Systeme haben die starke Konvention, dass ein Exit-Status von 0 Erfolg und ein Exit-Status ungleich Null Fehler bedeutet. Einige, aber nicht alle Programme unterscheiden zwischen verschiedenen Arten von Fehlern mit unterschiedlichen Exit-Codes ungleich Null. Beispielsweise wird in der grep
Regel 0 zurückgegeben, wenn das Muster gefunden wurde, 1, wenn es nicht gefunden wurde, und 2 (oder mehr), wenn ein Fehler aufgetreten ist, z. B. eine fehlende Datei.
Diese Konvention ist ziemlich fest mit Unix-Shells verbunden. Zum Beispiel in sh
, bash
und anderen Bourne-wie Muscheln, die if
Anweisung behandelt einen 0 Exit - Status als Erfolg / true, und einen von Null verschiedenen Exit - Status als Ausfall / false:
if your-command
then
echo ok
else
echo FAILURE
fi
Ich glaube, dass die Konventionen unter MS Windows ähnlich sind.
Jetzt hindert Sie sicherlich nichts mehr daran, ein eigenes Programm zu schreiben, das unkonventionelle Exit-Codes verwendet, insbesondere wenn nichts anderes damit interagiert. Beachten Sie jedoch, dass Sie gegen eine gut eingeführte Konvention verstoßen, und es könnte später wiederkommen und Sie beißen .
Die übliche Art und Weise, wie ein Programm diese Art von Informationen zurückgibt, besteht darin, diese zu drucken stdout
:
status = $(your-command)
echo Result is $status
set -e
irgendwo ein platziere.grep
wirddiff
1 zurückgegeben, wenn Unterschiede gefunden werden. und> 1, wenn ein Fehler aufgetreten ist.Hängt davon ab, was Ihre Umgebung erwartet.
Mein Favorit für Seltsamkeit, aus Wikipedia :
quelle
Ich denke, es gibt einen Präzedenzfall, wenn der Exit-Code aussagekräftige, relevante Informationen an den Aufrufer zurückgibt und die Definition des Erfolgs nicht wirklich binär ist. Der Präzedenzfall, an den ich denke, ist die Robokopie, die eine Menge verschiedener Dinge zurückgibt, je nachdem, was passiert ist .
Ich füge hinzu, dass wir aus diesem Grund immer ein wenig debuggen müssen - die meisten Hilfsprogramme gehen davon aus, dass der Exit-Code 0 == Erfolg hat. Es wird auch kein Fehler angezeigt.
quelle
Es ist eine schlechte Idee, für eine erfolgreiche Ausführung nicht 0 zurückzugeben, da dies zu Verwirrung bei denjenigen führen kann, die Ihr Programm ausführen. Was wäre, wenn einige Ihr Programm mehr als 100 Mal mit unterschiedlichen Eingaben ausgeführt hätten und wissen wollten, wie viele fehlgeschlagen oder erfolgreich abgeschlossen wurden. Ein einziger Erfolgswert macht es viel einfacher, Unterschiede zu erkennen, als viele unterschiedliche Werte.
Wenn Sie ein Programm haben, das mehrere erfolgreiche Rückkehrpfade hat, die alle verschiedene Dinge bedeuten können, würde ich sagen, dass dies ein Zeichen dafür ist, dass Ihr Programm schlecht entworfen ist.
quelle
Ich kenne einen Fall, den ich für akzeptabel halte. Ich kenne ein Test-Framework, das mit der Gesamtzahl der Testfehler endet. Wenn der Testläufer beispielsweise keine fehlgeschlagenen Tests durchführt, wird er mit Null beendet. Wenn ein Test fehlgeschlagen ist, obwohl der Testläufer selbst ordnungsgemäß ausgeführt wurde, wird er mit einer 1 beendet. Wenn zwei fehlgeschlagen sind, werden 2 usw. zurückgegeben. Dies ergibt bis zu 250, was "250 oder mehr Testfehler" bedeutet.
Es verwendet Exit-Codes> 250, um abnormale Exits anzuzeigen.
Obwohl dies gegen die Konvention verstößt, funktioniert es in der Praxis gut.
quelle
Es kommt wirklich darauf an, was Sie mit dem Code vermitteln wollen. DB2 gibt beispielsweise 100 zurück, wenn keine Daten gefunden wurden, sowie verschiedene andere positive Werte für Warnungen und negative Werte für Fehler. Oracle macht etwas Ähnliches.
Wenn es also unterschiedliche Erfolgszustände gibt, kann es sich lohnen, unterschiedliche Rückgabewerte zu verwenden.
quelle
Ein gutes Beispiel: man sa-update (Spamassassin)
CODES BEENDEN
In diesem Fall ist Exit 1 einfach ein informativer Code. Wenn ich jedoch den Code geschrieben hätte, hätte ich nicht 1 gewählt, da dies normalerweise ein Netzausfall ist.
quelle