Ja, der implizite Rückgabewert einer Funktion ist der Exit-Status des zuletzt ausgeführten Befehls. Dies gilt auch für jeden Punkt eines Shell-Skripts. Zu jedem Zeitpunkt in der Skriptausführungssequenz ist der aktuelle Beendigungsstatus der Beendigungsstatus des zuletzt ausgeführten Befehls. Sogar Befehl, der als Teil einer Variablenzuweisung ausgeführt wird : var=$(exit 34). Der Unterschied zu Funktionen besteht darin, dass eine Funktion den Exit-Status am Ende der Ausführung der Funktion ändern kann.
Die alternative Möglichkeit, den "aktuellen Exit-Status" zu ändern, besteht darin, eine Sub-Shell zu starten und mit dem erforderlichen Exit-Status zu beenden:
$ $(exit 34)
$ echo "$?"
34
Und ja, die Erweiterung des Exit-Status muss angegeben werden:
$ IFS='123'
$ $(exit 34)
$ echo $?
4
A (exit 34)auch arbeiten.
Einige mögen argumentieren, dass ein robusteres Konstrukt sein sollte $(return 34)und dass ein Exit das ausgeführte Skript "beenden" sollte. Funktioniert aber $(return 34)nicht mit einer Version von Bash. Es ist also nicht tragbar.
Der sicherste Weg, einen Exit-Status festzulegen, besteht darin, ihn so zu verwenden, wie er zum Arbeiten, Definieren und returnAusführen einer Funktion entwickelt wurde:
exitstatus(){ return "${1:-"$?"}"; }
Also am Ende einer Funktion. es ist genau gleichbedeutend, entweder nichts oder returnoder zu haben return "$?". Das Ende einer Funktion muss nicht die "letzte Codezeile einer Funktion" bedeuten.
#!/bin/sh
exitstatus(){ a="${1:-"$?"}"; return "$a"; }
gmx(){
if [ "$1" = "one" ]; then
printf 'foo ';
exitstatus 78
return "$?"
elif [ "$1" = "two" ]; then
printf 'baz ';
exitstatus 89
return
else
printf 'baz ';
exitstatus 90
fi
}
Wird drucken:
$ ./script
foo 78
baz 89
baz 90
Die einzige praktische Verwendung für "$?"besteht darin, entweder den Wert auszudrucken: echo "$?"oder ihn in einer Variablen zu speichern (da es sich um einen kurzlebigen Wert handelt und sich bei jedem ausgeführten Befehl ändert): exitstatus=$?(Denken Sie daran, die Variable in Befehlen wie anzugeben export EXITSTATUS="$?".
In dem returnBefehl liegt der gültige Wertebereich im Allgemeinen zwischen 0 und 255, es ist jedoch zu verstehen, dass die Werte von 126 + nvon einigen Shells verwendet werden, um einen speziellen Ausgangsstatus zu signalisieren. Daher wird generell empfohlen, 0-125 zu verwenden.
returnbesteht darin, dass für Funktionen, die wie definiert sindf() (...; cmd; return), die Optimierung verhindert wird, die einige Shellscmdausführen, wenn sie im selben Prozess wie die Subshell ausgeführt werden. Bei vielen Shells bedeutet dies auch, dass der Exit-Status der Funktion nicht die Informationen enthält,cmddie getötet wurden, als dies der Fall war (die meisten Shells können diese Informationen sowieso nicht abrufen).