Was ist der Unterschied zwischen dem return
y exit
Anweisung in Bash-Funktionen in Bezug auf Exit-Codes?
Antworten
Zu viele Anzeigen?Von man bash
auf return [n]
;
Bewirkt, dass eine Funktion ihre Ausführung beendet und den durch n angegebenen Wert an ihren Aufrufer zurückgibt. Wird n weggelassen, ist der Rückgabestatus derjenige des zuletzt ausgeführten Befehls im Funktionskörper.
... auf exit [n]
:
Bewirkt, dass die Shell mit einem Status von n beendet wird. Wird n nicht angegeben, ist der Exit-Status der des zuletzt ausgeführten Befehls. Ein Trap bei EXIT wird ausgeführt, bevor die Shell beendet wird.
EDIT:
Wie in der von Ihnen bearbeiteten Frage bezüglich der Exit-Codes, return
hat nichts mit Exit-Codes zu tun. Exit-Codes sind gedacht für Anwendungen/Skripte , nicht Funktionen. In dieser Hinsicht ist also das einzige Schlüsselwort, das den Exit-Code des Skripts festlegt (derjenige, der vom aufrufenden Programm mit der Option $?
Shell-Variable) ist exit
.
EDIT 2:
Meine letzte Aussage bezieht sich auf exit
verursacht einige Kommentare. Es wurde gemacht, um zu unterscheiden return
y exit
für das Verständnis des OP, und zwar bei tout bestimmten Punkt eines Programms/Shell-Skripts, exit
ist die einzige Möglichkeit, das Skript mit einem Exit-Code für den aufrufenden Prozess zu beenden.
Jeder in der Shell ausgeführte Befehl erzeugt einen lokalen "Exit-Code": Er setzt den $?
Variable zu diesem Code und kann mit if
, &&
und andere Operatoren zur bedingten Ausführung anderer Befehle.
Diese Exit-Codes (und der Wert des Parameters $?
Variable) werden bei jeder Befehlsausführung zurückgesetzt.
Übrigens wird der Exit-Code des letzten vom Skript ausgeführten Befehls als Exit-Code des Skripts selbst aus der Sicht des aufrufenden Prozesses verwendet.
Schließlich verhalten sich Funktionen, wenn sie aufgerufen werden, in Bezug auf die Exit-Codes wie Shell-Befehle. Der Exit-Code der Funktion ( innerhalb die Funktion) wird mit Hilfe von return
. Wenn also in einer Funktion return 0
ausgeführt wird, wird die Ausführung der Funktion mit einem Exit-Code von 0 beendet.
return
führt dazu, dass die aktuelle Funktion den Anwendungsbereich verlässt, während exit
führt dazu, dass das Skript an der Stelle endet, an der es aufgerufen wird. Hier ist ein Beispielprogramm, um dies zu erklären:
#!/bin/bash
retfunc()
{
echo "this is retfunc()"
return 1
}
exitfunc()
{
echo "this is exitfunc()"
exit 1
}
retfunc
echo "We are still here"
exitfunc
echo "We will never see this"
Ausgabe
$ ./test.sh
this is retfunc()
We are still here
this is exitfunc()
Ich glaube nicht, dass irgendjemand die Frage wirklich vollständig beantwortet hat, weil sie nicht beschreiben, wie die beiden verwendet werden. OK, ich denke, wir wissen, dass Ausgang tötet das Skript, wo auch immer es aufgerufen wird, und Sie können ihm auch einen Status zuweisen, z. B. exit oder exit 0 oder exit 7 usw. Dies kann verwendet werden, um festzustellen, wie das Skript zum Anhalten gezwungen wurde, wenn es von einem anderen Skript aufgerufen wurde, usw. Genug davon Ausgang .
return Wenn die Funktion aufgerufen wird, gibt sie den Wert zurück, der das Verhalten der Funktion angibt, in der Regel eine 1 oder eine 0. Ein Beispiel:
#!/bin/bash
isdirectory() {
if [ -d "$1" ]
then
return 0
else
return 1
fi
echo "you will not see anything after the return like this text"
}
Prüfen Sie dies:
if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi
Oder so:
isdirectory || echo "not a directory"
In diesem Beispiel kann der Test verwendet werden, um anzuzeigen, ob das Verzeichnis gefunden wurde. Beachten Sie, dass alles nach der return wird in der Funktion nicht ausgeführt. 0 ist wahr, aber falsch ist 1 in der Shell, anders als in anderen Programmiersprachen.
Für weitere Informationen über Funktionen: Rückgabe von Werten aus Bash-Funktionen
Hinweis : Die isdirectory Funktion ist nur für Unterrichtszwecke gedacht. So sollten Sie eine solche Option nicht in einem echten Skript ausführen.*
Denken Sie daran, dass Funktionen skriptintern sind und normalerweise mit der Return-Anweisung an den Ort zurückkehren, an dem sie aufgerufen wurden. Der Aufruf eines externen Skripts ist eine ganz andere Sache, und Skripte werden normalerweise mit einer exit-Anweisung beendet.
Der Unterschied "zwischen der return- und exit-Anweisung in Bash-Funktionen in Bezug auf die Exit-Codes" ist sehr gering. Beide geben einen Status zurück, nicht Werte per se. Ein Status von Null bedeutet Erfolg, während jeder andere Status (1 bis 255) einen Fehler anzeigt. Die Website return Anweisung kehrt zu dem Skript zurück, von dem aus sie aufgerufen wurde, während die exit-Anweisung das gesamte Skript beendet, egal wo sie angetroffen wird.
return 0 # Returns to where the function was called. $? contains 0 (success).
return 1 # Returns to where the function was called. $? contains 1 (failure).
exit 0 # Exits the script completely. $? contains 0 (success).
exit 1 # Exits the script completely. $? contains 1 (failure).
Wenn Ihre Funktion einfach endet, ohne dass ein return Anweisung wird der Status des zuletzt ausgeführten Befehls als Statuscode zurückgegeben (und wird in $?
).
Denken Sie daran, dass return und exit einen Statuscode von 0 bis 255 zurückgeben, der in $?
. Sie können nichts anderes in einen Statuscode einfügen (z. B., return "Katze" ); es wird nicht funktionieren. Ein Skript kann jedoch 255 verschiedene Gründe für einen Fehler zurückgeben, indem es Statuscodes verwendet.
Sie können Variablen setzen, die im aufrufenden Skript enthalten sind, oder echo Ergebnisse in der Funktion und die Verwendung von Befehlssubstitution im aufrufenden Skript; aber der Zweck von return und exit ist die Übergabe von Statuscodes, nicht von Werten oder Berechnungsergebnissen, wie man es in einer Programmiersprache wie C erwarten könnte.
- See previous answers
- Weitere Antworten anzeigen