Ich bin verwirrt über die Bedeutung des Exit-Codes am Ende eines Bash-Skripts: Ich kenne diesen Exit-Code 0 bedeutet, dass es erfolgreich beendet wurde und dass es viel mehr Exit-Code-Nummern gibt (127, wenn ich mich nicht irre?)
Meine Frage bezieht sich darauf, wann Exit-Code 0 am Ende eines Skripts angezeigt wird Erzwingt es den Exit-Code als 0, auch wenn das Skript fehlgeschlagen ist oder eine andere Bedeutung hat?
Kommentare
- Wenn ein Skript mit
exit 0
wird mit dem Exit-Code 0 beendet, unabhängig davon, was im Skript passiert. - @Hatclock warum nicht ' Wenn Sie Ihrer Antwort eine vollständig zugesagte Antwort geben, kann ich sie als Kommentar nicht markieren, und ich glaube nicht, dass Sie falsche Internetpunkte für die Beantwortung erhalten (richtig?). Nur ein Gedanke. .. (Lob für die schnelle Antwort)
- Ich ' bin an einem Bahnhof auf meinem Telefon, ich habe mag es nicht, zu viel auf meinem Handy zu tippen. ilkkachu scheint jedoch eine gute Antwort zu haben!
- @Hatclock Nein, überhaupt nicht. Wenn ein Skript mit
exit 0
endet, wird es nur dann mit dem Code 0 beendet, wenn diese letzte Anweisung ausgeführt wurde. Die einzige Auswirkung vonexit 0
am Ende des Skripts besteht darin, 0 anstelle des Status aus der vorherigen Anweisung zurückzugeben. - @Gilles Das war mehrdeutig formulierte Antwort meinerseits. Wenn ein Skript zu irgendeinem Zeitpunkt
exit 0
ausführt, gibt es den Exit-Code 0 zurück, unabhängig davon, was zuvor passiert ist.
Antwort
Der eingebaute Befehl exit
verlässt die Shell (von Bash „s Referenz ):
exit [n]
Beenden Sie die Shell und geben Sie den Status n zurück Wenn n weggelassen wird, ist der Exit-Status der des zuletzt ausgeführten Befehls. Jeder Trap bei EXIT wird ausgeführt, bevor die Shell beendet wird.
Das Ausführen bis zum Ende der Datei wird ebenfalls beendet und der Rückkehrcode des letzten Befehls zurückgegeben. Ja, eine endgültige exit 0
bewirkt, dass das Skript unabhängig vom Beendigungsstatus von mit erfolgreichem Status beendet wird die vorherigen Befehle. (Das heißt, vorausgesetzt, das Skript erreicht das endgültige exit
.) Am Ende eines Skripts können Sie auch true
verwenden oder , um einen Exit-Code von Null zu erhalten.
Natürlich würden Sie öfter exit
aus einem , um das Skript in der Mitte zu beenden.
Diese sollten eine 1 ausgeben ($?
enthält den vom vorherigen Befehl zurückgegebenen Exit-Code). :
sh -c "false" ; echo $? sh -c "false; exit" ; echo $?
Während dies eine 0 ausgeben sollte:
sh -c "false; exit 0" ; echo $?
Ich bin es nicht Sicher, wenn das Konzept des Skripts „fehlschlägt“ beim Ausführen eines exit
sinnvoll ist, da es durchaus möglich ist, dass einige vom Skript ausgeführte Befehle fehlschlagen, das Skript selbst jedoch erfolgreich ist . Es ist Sache des Autors des Skripts, zu entscheiden, was ein Erfolg ist und was nicht.
Außerdem ist der Standardbereich für Exit-Codes 0..255. Codes über 127 werden von der Shell verwendet, um einen durch ein Signal beendeten Prozess anzuzeigen, können jedoch auf die übliche Weise zurückgegeben werden. Der Systemaufruf wait
gibt tatsächlich einen breiteren Wert zurück, wobei der Rest Statusbits enthält, die vom Betriebssystem gesetzt wurden.
Kommentare
- Cool, ich wusste ' nichts über die Nummerierung der 8-Bit-Exit-Codes. Vielen Dank!
- Beachten Sie, dass ein Prozess beim Beenden nicht mit einem Exit-Code > 127 beendet wird. ' s nur, dass einige Shells
$?
in diesem Fall auf 128 + signum setzen. Weitere Informationen finden Sie unter Standard-Exit-Code, wenn der Prozess beendet wird? . -
exit 0
wird nur zurückgegeben 0, wenn der Exit ausgeführt wird. (Es könnte auf einem anderen Weg beendet werden.)
Antwort
0 bedeutet Erfolg, positive ganze Zahlen bedeuten Misserfolg. Es gibt 255 verschiedene Fehlercodes, aber die Werte 126 und höher sind reserviert, um anzuzeigen, dass ein Programm nicht gestartet werden konnte (126 oder 127) oder durch ein Signal (129 und höher) beendet wurde. Siehe Standard-Exit-Code, wenn der Prozess beendet wird? und Welche Rückgabe- / Exit-Werte kann ich in Bash-Funktionen / Skripten verwenden? für weitere Informationen.
Der Exit-Status eines Shell-Skripts ist der Exit-Status des letzten Befehls, den das Skript ausgeführt hat. So wird beispielsweise
#!/bin/sh somecommand
zurückgegeben Der Exit-Status von somecommand
, während
#!/bin/sh somecommand exit 0
0 zurückgibt, unabhängig davon, was somecommand
kehrte zurück.Dieses zweite Skript könnte auch geschrieben werden.
#!/bin/sh somecommand true
Das Setzen von exit 0
am Ende eines Skripts führt nicht unbedingt dazu Dies gibt 0 zurück. Dies gibt nur 0 zurück, wenn das Ende des Skripts erreicht ist. Beispielsweise gibt das folgende Skript immer 3 zurück:
#!/bin/sh exit 3 exit 0
The Das folgende Skript gibt zusätzlich zur Anzeige einer Meldung über einen Syntaxfehler immer einen Fehlercode zurück:
#!/bin/sh } exit 0
Das folgende Skript gibt je nach Fehler entweder 1 oder 0 zurück erstes Argument:
#!/bin/sh if [ "$1" = "foo" ]; then exit 1 fi exit 0
Das folgende Skript gibt den Status von somecommand
zurück, da set -e
bewirkt, dass das Skript beendet wird, wenn somecommand
fehlschlägt:
#!/bin/sh set -e somecommand exit 0