wake-up-neo.com

Unterschied zwischen Return und Exit in Bash-Funktionen

Was ist der Unterschied zwischen der Anweisung return und exit in Bash-Funktionen in Bezug auf Exit-Codes?

386
lecodesportif

Von man bash auf return [n];

Bewirkt, dass eine Funktion die Ausführung beendet und den durch n angegebenen Wert an ihren Aufrufer zurückgibt. Wenn n weggelassen wird, ist der Rückgabestatus der des letzten im Funktionskörper ausgeführten Befehls.

... bei exit [n]:

Bewirkt, dass die Shell mit dem Status n beendet wird. Wenn n weggelassen wird, ist der Beendigungsstatus der des zuletzt ausgeführten Befehls. Ein Trap bei EXIT wird ausgeführt, bevor die Shell beendet wird.

EDIT:

Gemäß Ihrer Bearbeitung der Frage in Bezug auf Exit-Codes hat return nichts mit Exit-Codes zu tun. Exit-Codes sind für Anwendungen/Skripte bestimmt, nicht für Funktionen. In dieser Hinsicht ist das einzige Schlüsselwort, das den Exit-Code des Skripts festlegt (das Schlüsselwort, das vom aufrufenden Programm mit der Shell-Variablen $? abgefangen werden kann), exit.

EDIT 2:

Meine letzte Aussage, die sich auf exit bezieht, verursacht einige Kommentare. Es wurde gemacht, um return und exit für das Verständnis des OP zu unterscheiden, und zwar an jedem gegebenen Punkt von Ein Programm/Shell-Skript, exit, ist die einzige Möglichkeit, das Skript mit einem Beendigungscode für den aufrufenden Prozess zu beenden.

Jeder in der Shell ausgeführte Befehl erzeugt einen lokalen "Exit-Code": Er setzt die Variable $? auf diesen Code und kann mit if, && und anderen Operatoren verwendet werden, um andere bedingt auszuführen befehle.

Diese Exit-Codes (und der Wert der Variablen $?) werden bei jeder Befehlsausführung zurückgesetzt.

Im Übrigen wird der Exit-Code des letzten vom Skript ausgeführten Befehls als Exit-Code des Skripts verwendet, wie er vom aufrufenden Prozess angezeigt wird.

Schließlich fungieren Funktionen, wenn sie aufgerufen werden, als Shell-Befehle in Bezug auf Exit-Codes. Der Beendigungscode der Funktion ( innerhalb der Funktion) wird mit return festgelegt. Wenn also in einer Funktion return 0 ausgeführt wird, wird die Funktionsausführung abgebrochen und der Beendigungscode lautet 0.

280
Diego Sevilla

return führt dazu, dass die aktuelle Funktion den Gültigkeitsbereich verlässt, während exit das Skript an der Stelle beendet, 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()
272
SiegeX

Ich glaube nicht, dass jemand die Frage wirklich vollständig beantwortet hat, da er nicht beschreibt, wie die beiden verwendet werden. OK Ich denke, wir wissen, dass exit das Skript beendet, wo immer es aufgerufen wird, und Sie können ihm auch einen Status zuweisen, z. B. exit oder exit 0 oder exit 7 und so weiter. Dies kann verwendet werden, um zu bestimmen, wie das Skript angehalten werden musste, wenn es von einem anderen Skript usw. aufgerufen wurde. Genug beim Beenden.

return gibt beim Aufruf den angegebenen Wert zurück, um das Verhalten der Funktion anzuzeigen, normalerweise eine 1 oder eine 0. 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"
    }

überprüfen Sie wie folgt:

    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 nach der Rückkehr nichts in der Funktion ausgeführt wird. 0 ist wahr, aber falsch ist 1 in der Shell, anders als bei anderen Programmen.

Weitere Informationen zu Funktionen: http://www.linuxjournal.com/content/return-values-bash-functions

HINWEIS: Die Funktion isdirectory dient nur zu Anleitungszwecken. Dies sollte nicht der Fall sein, wenn Sie eine solche Option in einem echten Skript ausführen.

51
Mike Q

Denken Sie daran, dass Funktionen in einem Skript intern sind und normalerweise von dort zurückgegeben werden, woher sie mit der return-Anweisung aufgerufen wurden. Das Aufrufen eines externen Skripts ist eine völlig andere Sache, und Skripts enden normalerweise mit einer exit-Anweisung.

Der Unterschied "zwischen der Return- und der Exit-Anweisung in BASH-Funktionen hinsichtlich der Exit-Codes" ist sehr gering. Beide geben einen Status zurück, nicht Werte per se. Ein Status von Null zeigt Erfolg an, während jeder andere Status (1 bis 255) einen Fehler anzeigt. Die return-Anweisung kehrt zu dem Skript zurück, von dem aus sie aufgerufen wurde, während die exit-Anweisung das gesamte Skript von jedem Punkt an beendet, an dem es auftritt.

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 ohne return-Anweisung endet, wird der Status des zuletzt ausgeführten Befehls als Statuscode zurückgegeben (und in $? gesetzt).

Denken Sie daran, geben Sie beim Zurückkehren und Beenden einen Statuscode von 0 bis 255 zurück, der in $? verfügbar ist. Sie können nichts anderes in einen Statuscode einfügen (z. B. "cat" zurückgeben). es wird nicht funktionieren. Ein Skript kann jedoch 255 verschiedene Fehlerursachen mithilfe von Statuscodes zurückgeben.

Sie können die im aufrufenden Skript enthaltenen Variablen festlegen oder die Ergebnisse der Funktion als Echo ausgeben und die Befehlsersetzung im aufrufenden Skript verwenden. Der Zweck von return und exit besteht jedoch darin, Statuscodes zu übergeben, keine Werte oder Berechnungsergebnisse, wie dies in einer Programmiersprache wie C zu erwarten ist.

29
user2100135

Manchmal führen Sie ein Skript mit . oder source aus.

. a.sh

Wenn Sie exit in a.sh einfügen, wird das Skript nicht nur beendet, sondern die Shell-Sitzung beendet.

Wenn Sie return in a.sh einfügen, wird die Skriptverarbeitung einfach gestoppt.

21
Juraj

In einfachen Worten (hauptsächlich für Anfänger in der Codierung) können wir sagen,

`return` : exits the function,
`exit()` : exits the program(called as process while running)

Auch wenn Sie beobachtet haben, ist dies sehr einfach, aber ...,

`return` : is the keyword
`exit()` : is the function
6
Jyo the Whiff
  • exit beende den aktuellen Prozess; Betrachten Sie dieses System mit oder ohne Exit-Code mehr als eine Programmfunktion. Beachten Sie, dass beim Sourcing exit die Shell beendet, beim Ausführen jedoch nur exit das Skript.

  • return von einer Funktion mit oder ohne Rückkehrcode zu der Anweisung nach dem Aufruf zurückkehren. return ist optional und wird am Ende der Funktion impliziert. return kann nur innerhalb einer Funktion verwendet werden.

Ich möchte hinzufügen, dass es nicht einfach ist, das Skript aus einer Funktion heraus zu exit, 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"

mache folgendes:

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, die potenzielle Prozedur in ( und ) einzuschließen.

#!/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

jetzt wird in beiden Fällen nur test beendet.

5
fcm

Die Frage des OP: Was ist der Unterschied zwischen der Return- und der Exit-Anweisung in BASH-Funktionen in Bezug auf Exit-Codes?

Zunächst ist eine Klarstellung erforderlich:

  • Eine (return | exit) -Anweisung ist nicht erforderlich, um die Ausführung einer (function | Shell) zu beenden. Eine (function | Shell) wird beendet, wenn das Ende ihrer Codeliste erreicht ist, auch wenn keine (return | exit) -Anweisung vorliegt.
  • Eine (return | exit) -Anweisung ist nicht erforderlich, um einen Wert von einer abgeschlossenen (function | Shell) zurückzugeben. Jeder Prozess hat eine eingebaute Variable $? die immer einen numerischen Wert hat. Es ist eine spezielle 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 | untergeordneten | Shell) wird der Wert an die (übergeordnete | aufrufende | Shell) zurückgegeben. Dies gilt unabhängig davon, ob der zuletzt ausgeführte Befehl ("return [n]" | "exit [n]") oder einfach ("return") oder etwas anderes ist, das zufällig der letzte Befehl im aufgerufenen Funktionscode ist.

Wählen Sie in der obigen Aufzählungsliste aus "(x | y)" entweder immer das erste Element oder immer das zweite Element aus, um Aussagen über Funktionen und Rückkehr bzw. Shells und Beenden zu erhalten.

Klar ist, dass beide die spezielle Variable $ gemeinsam verwenden? Werte nach Beendigung nach oben übergeben.

* Nun zu den besonderen Möglichkeiten, die $? kann eingestellt werden:

  • Wenn eine aufgerufene Funktion beendet wird und zu ihrem Aufrufer zurückkehrt, dann $? im aufrufer wird gleich der endwert von $ sein? in der abgebrochenen Funktion.
  • Wenn eine übergeordnete Shell implizit oder explizit auf eine einzelne untergeordnete Shell wartet und durch das Beenden dieser untergeordneten Shell freigegeben wird, wird $? in der übergeordneten Shell wird gleich dem Endwert von $ sein? in der terminierten Sub-Shell.
  • Einige eingebaute Funktionen können $? abhängig von ihrem Ergebnis. Aber manche nicht.
  • Eingebaute Funktionen "return" und "exit", gefolgt von einem numerischen Argument, beides $? mit Argument, und beenden Sie die Ausführung.

Es ist erwähnenswert, dass $? Sie können einen Wert zuweisen, indem Sie exit in einer Sub-Shell wie folgt aufrufen:

# (exit 259)
# echo $?
3  
2
Craig Hicks

Erstens ist return ein Schlüsselwort und exit mein Freund ist eine Funktion.

Das heißt, hier ist eine einfache Erklärung.

return Gibt einen Wert von einer Funktion zurück.

exit Die aktuelle Shell wird beendet oder verlassen.

1
Ahmad Awais