Was ist der Unterschied zwischen dem return
y exit
Anweisung in Bash-Funktionen in Bezug auf Exit-Codes?
Antworten
Zu viele Anzeigen?-
exit
beendet die aktuelle Prozess mit oder ohne Exit-Code, betrachten Sie dies eher als System denn als Programmfunktion. Beachten Sie, dass, wenn Beschaffung ,exit
wird die Shell beendet. Wenn sie jedoch läuft, wird sie nurexit
das Drehbuch. -
return
aus einer Funktion gehen zurück zur Anweisung nach dem Aufruf, mit oder ohne Rückgabewert.return
ist optional und wird am Ende der Funktion implizit angegeben.return
kann nur innerhalb einer Funktion verwendet werden.
Ich möchte hinzufügen, dass es nicht einfach ist, bei der Suche nach Quellen exit
das Skript aus einer Funktion heraus, ohne die Shell zu beenden. Ich denke, ein Beispiel ist besser für ein "Test"-Skript:
#!/bin/bash
function die(){
echo ${1:=Something terrible wrong happen}
#... clean your trash
exit 1
}
[ -f /whatever/ ] || die "whatever is not available"
# Now we can proceed
echo "continue"
das Folgende zu tun:
user$ ./test
Whatever is not available
user$
test
-und die Shell wird geschlossen.
user$ . ./test
Whatever is not available
Nur test
wird beendet und die Eingabeaufforderung wird angezeigt.
Die Lösung besteht darin, das potenzielle Verfahren in (
y )
:
#!/bin/bash
function die(){
echo $(1:=Something terrible wrong happen)
#... Clean your trash
exit 1
}
( # Added
[ -f /whatever/ ] || die "whatever is not available"
# Now we can proceed
echo "continue"
) # Added
In beiden Fällen wird nur test
wird beendet.
Die Frage des Auftraggebers: Was ist der Unterschied zwischen der return- und exit-Anweisung in BASH-Funktionen in Bezug auf die Exit-Codes?
Zunächst einmal ist eine Klarstellung erforderlich:
-
Eine (return|exit) Anweisung ist nicht erforderlich, um die Ausführung einer (Funktion|Shell) zu beenden. Eine (Funktion|Shell) wird beendet, wenn sie das Ende ihrer Codeliste erreicht, auch wenn keine (return|exit) Anweisung vorhanden ist.
-
Eine (return|exit) Anweisung ist nicht erforderlich, um einen Wert von einer beendeten (Funktion|Shell) zurückzugeben. Jeder Prozess hat eine eingebaute Variable
$?
die immer einen numerischen Wert hat. Es handelt sich um eine besondere Variable, die nicht wie "?=1" gesetzt werden kann, sondern nur auf besondere Weise (siehe unten *).Der Wert von $? nach dem letzten auszuführenden Befehl in der (aufgerufenen Funktion | Sub-Shell) ist der Wert, der an die (aufrufende Funktion | übergeordnete Shell) zurückgegeben wird. Dies gilt unabhängig davon, ob der letzte ausgeführte Befehl ("return [n]"| "exit [n]") oder einfach ("return" oder etwas anderes, das zufällig der letzte Befehl im Code der aufgerufenen Funktion ist) ist.
In der obigen Aufzählung wählen Sie aus "(x|y)" entweder immer den ersten oder immer den zweiten Eintrag, um Aussagen über Funktionen und Rückgabe bzw. Shells und Exit zu erhalten.
Klar ist, dass sie beide die spezielle Variable $?
um Werte nach ihrer Beendigung nach oben weiterzugeben.
* Nun zu den besonderen Möglichkeiten, die $?
eingestellt werden kann:
- Wenn eine aufgerufene Funktion beendet wird und zu ihrem Aufrufer zurückkehrt, ist $? im Aufrufer gleich dem Endwert von
$?
in der beendeten Funktion. - Wenn eine Parent-Shell implizit oder explizit auf eine einzelne Sub-Shell wartet und durch Beendigung dieser Sub-Shell freigegeben wird, dann
$?
in der übergeordneten Shell entspricht dem endgültigen Wert von$?
in der beendeten Unterschale. - Einige eingebaute Funktionen können die
$?
abhängig von ihrem Ergebnis. Manche aber auch nicht. - Die eingebauten Funktionen "return" und "exit", wenn sie von einem numerischen Argument gefolgt werden, setzen beide
$?
mit ihrem Argument, und beenden die Ausführung.
Es ist erwähnenswert, dass $?
kann durch den Aufruf von exit in einer Sub-Shell ein Wert zugewiesen werden, etwa so:
# (exit 259)
# echo $?
3
Einigen der anderen Antworten wurde ein praktischer Aspekt hinzugefügt:
Beide können Exit-Codes angeben - Standard oder von der Funktion definiert, und der einzige "Standard" ist Null für Erfolg sowohl für Exit als auch Return. Jeder Status kann eine benutzerdefinierte Zahl 0-255 haben, auch für Erfolg.
Return wird häufig für interaktive Skripte verwendet, die in der aktuellen Shell laufen und mit . script.sh
zum Beispiel, und kehrt einfach zu Ihrer aufrufenden Shell zurück. Der Rückgabecode ist dann für die aufrufende Shell zugänglich - $?
gibt Ihnen den definierten Rückgabestatus an. Exit schließt in diesem Fall auch Ihre Shell (einschließlich SSH-Verbindungen, falls Sie so arbeiten).
Exit ist notwendig, wenn das Skript ausführbar ist und von einem anderen Skript oder einer Shell aufgerufen wird und in einer Subshell läuft. Die Exit-Codes sind dann für die aufrufende Shell zugänglich - return würde in diesem Fall einen Fehler ergeben.