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 return
Ausführen einer Funktion entwickelt wurde:
exitstatus(){ return "${1:-"$?"}"; }
Also am Ende einer Funktion. es ist genau gleichbedeutend, entweder nichts oder return
oder 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 return
Befehl liegt der gültige Wertebereich im Allgemeinen zwischen 0 und 255, es ist jedoch zu verstehen, dass die Werte von 126 + n
von einigen Shells verwendet werden, um einen speziellen Ausgangsstatus zu signalisieren. Daher wird generell empfohlen, 0-125 zu verwenden.
return
besteht darin, dass für Funktionen, die wie definiert sindf() (...; cmd; return)
, die Optimierung verhindert wird, die einige Shellscmd
ausfü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,cmd
die getötet wurden, als dies der Fall war (die meisten Shells können diese Informationen sowieso nicht abrufen).