Beenden Sie den Code am Ende eines Bash-Skripts

22

Ich bin verwirrt über die Bedeutung des Exit-Codes am Ende eines Bash-Skripts: Ich weiß, dass der Exit-Code 0 bedeutet, dass er erfolgreich abgeschlossen wurde und dass es noch viele weitere Exit-Code-Nummern gibt (127, wenn ich mich nicht irre?).

Meine Frage ist, ob der Exit-Code 0 am Ende eines Skripts angezeigt wird. Erzwingt er den Exit-Code als 0, auch wenn das Skript fehlgeschlagen ist, oder hat er eine andere Bedeutung?

Gehackt
quelle
2
Wenn ein Skript mit endet exit 0, wird es mit dem Beendigungscode 0 beendet, unabhängig davon, was im Skript passiert.
Hatclock
@Hatclock warum hast du deine Antwort nicht vollständig zugesagt? Als Kommentar kann ich es nicht markieren, und ich glaube nicht, dass Sie gefälschte Internetpunkte für die Beantwortung bekommen (richtig?) Nur ein Gedanke ... (Lob für die schnelle Antwort)
Busted
1
Ich bin auf meinem Handy an einem Bahnhof. Ich mag es nicht, zu viel auf meinem Handy zu tippen. ilkkachu scheint jedoch eine gute Antwort zu haben!
Hatclock
Siehe auch: Standard-Exit-Code bei Prozessende?
Stéphane Chazelas
2
@Hatclock Nein, überhaupt nicht. Wenn ein Skript mit endet exit 0, wird es nur dann mit dem Code 0 beendet, wenn diese letzte Anweisung ausgeführt wurde. Die einzige Auswirkung exit 0am Ende des Skripts besteht darin, 0 anstelle des Status der vorherigen Anweisung zurückzugeben.
Gilles 'SO- hör auf böse zu sein'

Antworten:

22

Der eingebaute Befehl beendet exitdie Shell (aus Bashs Referenz ):

exit [n]
Beenden Sie die Shell und geben Sie dem übergeordneten Element der Shell den Status n zurück. Wenn n weggelassen wird, ist der Beendigungsstatus 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, wobei der Rückkehrcode des letzten Befehls zurückgegeben wird. Ja, ein Finale exit 0bewirkt, dass das Skript mit erfolgreichem Status beendet wird, unabhängig vom Beendigungsstatus der vorherigen Befehle. (Das heißt, vorausgesetzt, das Skript erreicht das Finale exit.) Am Ende eines Skripts können Sie auch trueoder verwenden :, um einen Exit-Code von Null zu erhalten.

Natürlich verwenden Sie öfter exitvon innen an if, 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 nicht sicher, ob das Konzept des Skripts beim Ausführen von exitsinnvoll ist, da es durchaus möglich ist, dass einige vom Skript ausgeführte Befehle fehlschlagen, das Skript selbst jedoch erfolgreich ist. Es liegt an dem Autor des Skripts, zu entscheiden, was ein Erfolg ist und was nicht.

Der Standardbereich für Exit-Codes ist 0..255. Codes über 127 werden von der Shell verwendet, um einen Prozess anzuzeigen, der durch ein Signal beendet wird. Sie können jedoch auf die übliche Weise zurückgegeben werden. Der waitSystemaufruf gibt tatsächlich einen breiteren Wert zurück, wobei der Rest vom Betriebssystem gesetzte Statusbits enthält.

ilkkachu
quelle
Cool, ich wusste nichts über die Nummerierung der 8-Bit-Ausgangscodes. Vielen Dank!
Busted
Beachten Sie, dass ein Prozess, der beendet wird, nicht mit einem Beendigungscode> 127 beendet $?wird. In diesem Fall sind nur einige Shells auf 128 + signum eingestellt. Siehe Standard-Exit-Code, wenn der Prozess beendet wird. für Details.
Stéphane Chazelas
exit 0gibt nur 0 zurück, wenn der Exit ausgeführt wird. (es könnte auf einem anderen Weg abfahren).
Strg-Alt-Delor
18

0 bedeutet Erfolg, positive ganze Zahlen bedeuten Misserfolg. Es gibt 255 verschiedene Fehlercodes, aber Werte 126 und höher sind reserviert, um anzuzeigen, dass ein Programm nicht gestartet werden konnte (126 oder 127) oder von einem Signal (129 und höher) beendet wurde. Siehe Standard-Exit-Code, wenn der Prozess beendet wird. und Welche Return / Exit-Werte kann ich in Bash-Funktionen / Skripten verwenden? für mehr Informationen.

Der Beendigungsstatus eines Shell-Skripts ist der Beendigungsstatus des letzten Befehls, den das Skript ausgeführt hat. Also zum Beispiel

#!/bin/sh
somecommand

Liefert den Exit-Status von somecommand, wohingegen

#!/bin/sh
somecommand
exit 0

gibt 0 zurück, unabhängig davon, was somecommandzurückgegeben wurde. Dieses zweite Skript könnte auch geschrieben werden

#!/bin/sh
somecommand
true

Wenn Sie exit 0am Ende eines Skripts einfügen, wird nicht unbedingt 0 zurückgegeben. Dadurch wird 0 nur dann zurückgegeben, wenn das Ende des Skripts erreicht ist. Das folgende Skript gibt beispielsweise immer 3 zurück:

#!/bin/sh
exit 3
exit 0

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 erstem Argument entweder 1 oder 0 zurück:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

Das folgende Skript gibt den Status von zurück somecommand, da set -edas Skript beendet wird, wenn ein somecommandFehler auftritt:

#!/bin/sh
set -e
somecommand
exit 0
Gilles 'SO - hör auf böse zu sein'
quelle