557 Stimmen

Unterschied zwischen return und exit in Bash-Funktionen

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

14voto

fcm Punkte 1031
  • 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 nur exit 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.

6voto

Craig Hicks Punkte 1394

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

5voto

Jyo the Whiff Punkte 787

In einfachen Worten (vor allem für Neulinge in der Programmierung), können wir sagen,

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

Auch if Sie haben beobachtet, dass dies sehr grundlegend ist, aber...,

    `return`: is the keyword
    `exit()`: is the function

3voto

Scott Smith Punkte 864

Wenn Sie ein Bash-Skript in eine Funktion umwandeln, ersetzen Sie normalerweise exit N con return N . Der Code, der die Funktion aufruft, behandelt den Rückgabewert genauso wie einen Exit-Code aus einem Unterprozess.

Verwendung von exit innerhalb der Funktion wird das gesamte Skript beendet.

2voto

user1636250 Punkte 29

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X