Ich schrieb ein Skript und stieß dann auf ein seltsames Problem. Wenn ich ein Skript mit einer Reihe von Funktionen erhalte, die eine Fehlerfunktion aufrufen, die eine Zeichenfolge ausgibt und dann beendet, wird meine Shell beendet. Ich weiß, warum es das tut. Dies liegt daran, dass sich ein Funktionsaufruf im selben Prozessbereich befindet wie der Aufrufer (zumindest in bash), sodass der Exit innerhalb der Funktion den aktuellen Prozess mit dem angegebenen Beendigungscode beendet. Beispiel:Ausfahrt Funktionsstapel ohne Shell
error()
{
echo $1
exit 1
}
fn()
{
if [ $# == 0 ]; then
error "Insufficient parameters."
fi
# do stuff
}
$ fn
Insufficient parameters.
[shell terminates]
Also meine Frage ist, kann ich alle Funktionen in der Funktion Stapel verlassen, ohne die aktuelle Shell beendet wird und ohne einen neuen Sub-Shell Laichen?
Dank
Die folgende "Rückkehr" ist vorzuziehen, wie es scheint: das ist die Funktionalität, die für diesen Zweck in der Schale eingebaut wird. Die Schale zu töten ist unelegant. – JPGConnolly
@JPGConnolly was meinst du mit 'Die folgende" Rückkehr "ist vorzuziehen, scheint es? Wenn Sie die eingebaute 'return'-Anweisung verwenden wollen, dann lesen Sie die Frage nicht, da es keine einfache Möglichkeit gibt, sie so zu verwenden, dass sie innerhalb einer Funktion, die mehrere tiefere Funktionen genannt wird, zurück in die Basis-Shell springt den Rückgabewert jedes Funktionsaufrufs abfragen, was in manchen Fällen nicht praktikabel oder möglich ist. Ein 'kill -INT $$' ist etwas eleganter als die Verwendung von 'return' in diesem Fall. – Adrian
Welchen Wert von $? sieht der Aufrufer der Quellfunktion? Oder beendet es das auch? – Michael