Bedeutung von Exit 0, Exit 1 und Exit 2 in einem Bash-Skript

49

Ich mache einige Übungsübungen.

Schreiben Sie ein Skript, das eine Monatszahl als Argument erhält und diese Zahl in einen Monatsnamen übersetzt. Das Ergebnis wird auf Standard gedruckt.

Ich habe eine Lösung gefunden:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

Was tun exit 1, exit 0und exit 2bedeuten, und warum sie verwenden wir?

andrej benedičič
quelle
5
Ein erfolgreich ausgeführter Code sollte mit Code 0 beendet werden. Andere Werte weisen auf einen Fehler hin. Siehe zum Beispiel Exit-Codes mit besonderer Bedeutung
V. Olsen
2
Ein Bash-Skript ist wie ein Kino, da gibt es verschiedene. Die exit-Anweisungen markieren die Position der Exits für den Bash-Interpreter. Wenn das Skript ausgeführt wird, muss der Interpreter bis zum nächsten Exit ausgeführt werden.
DepressedDaniel
5
Wenn dies der Code ist, den Sie geschrieben haben, warum haben Sie dann Anweisungen verwendet, die Sie nicht einmal verstehen?
Dmitry Grigoryev
5
1) Sie haben sofort nach dem Absenden der Frage eine Antwort akzeptiert . Warten Sie 24 Stunden auf noch bessere Antworten. 2) Die akzeptierte Antwort ist falsch und irreführend. Die richtige Antwort lautet: "Es gibt keine Standardbedeutung für die Exit-Codes (über 0 = Erfolg); Sie als Skriptentwickler definieren die Semantik." 3) Wenn Sie dieses Skript erstellt haben, warum haben Sie die Exit-Befehle hinzugefügt (die alle logisch überflüssig sind oder zu "Exit 1" zusammenfallen können, da Sie if-else verwenden)?
AnoE

Antworten:

58

Hier ist eine gute Referenz für Shell-Exit-Codes :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

Vorsichtsmaßnahme: Die Verwendung des richtigen Beendigungscodes ist nicht erforderlich und wird von der Shell nicht erzwungen. Entwickler können die Anleitung ignorieren, wenn sie dies für sinnvoll halten.

user535733
quelle
8
Sei aber vorsichtig. Was ein Exit-Code bedeutet, liegt ganz bei den Entwicklern des Programms.
muru
Während die verlinkte Quelle, das Advanced Bash Scripting Guide, behauptet, " Reserved Exit Codes" (Hervorhebung im Original) zu zeigen, ist diese Behauptung sowohl unzitiert als auch völlig falsch .
Eliah Kagan
23

Die Verwendung von exitund einer Zahl ist eine praktische Möglichkeit, das Ergebnis Ihres Skripts anzuzeigen. Es ahmt die Art und Weise nach, wie Bash-Befehle einen Rückkehrcode ausgeben. Bei bash-Befehlen bedeutet der Rückgabewert 0 in der Regel, dass alles fehlerfrei ausgeführt wurde. exitAußerdem stoppt Ihr Skript die Ausführung an diesem Punkt und kehrt zur Befehlszeile zurück.

Jeder Rückkehrcode, der größer als 0 ist, zeigt eine Art Fehler an, obwohl der Fehler manchmal nicht kritisch ist. Für jeden Befehl sollte es möglich sein, eine Dokumentation zu finden, die Ihnen sagt, was jeder Rückkehrcode bedeutet.

Sie können den Rückkehrcode des letzten Bash-Befehls erhalten, indem Sie die Shell-Variable $?wie folgt verwenden:

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

Wenn Sie dies in einem Skript verwenden, können Sie den Rückkehrcode auf die gleiche Weise abfragen, wenn die Ausführung abgeschlossen ist. So werden Sie sehen, dass mit:

exit 2
exit 0

Ist irgendwie sinnlos, da man das exit 0Teil nie erreichen kann .

Arronisch
quelle
3

Alleine exitimpliziert dies einen Exit-Wert von Null oder den erfolgreichen Abschluss Ihres Skripts. Sie müssen das Null-Argument nicht zum Exit-Befehl hinzufügen, um den erfolgreichen Abschluss anzuzeigen. Ihr Skript wird möglicherweise (oder wahrscheinlich) erfolgreich beendet, obwohl es auf eine fehlerhafte Bedingung hin überprüft wird. In diesem Fall soll das Programm mit der Fehlerbedingung (oder 1) beendet werden.

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

Der exitBefehl in der letzten Zeile muss überhaupt nicht vorhanden sein. Es könnte mit der Null oder gar nicht aufgerufen werden. Ohne Angabe des 1-Arguments für den Befehl exit wäre die Antwort in all diesen Fällen echo $?Null.

echo $?Wenn Sie jedoch das Argument 1 für den Befehl exit angeben, lautet die Antwort auf 1. Verwenden Sie also das Argument 1 für den Befehl exit, wenn Sie angeben möchten, dass das Skript mit einer Fehlerbedingung beendet wurde.

Geekasaurus
quelle