Ich habe die Anweisung "exit 1" in meinen Bash-Funktionen verwendet, um das gesamte Skript zu beenden, und es hat gut funktioniert:
function func()
{
echo "Goodbye"
exit 1
}
echo "Function call will abort"
func
echo "This will never be printed"
Aber dann wurde mir klar, dass es nicht funktioniert, wenn es wie folgt aufgerufen wird:
res=$(func)
Ich verstehe, dass ich eine Unterschale erstellt habe und "exit 1" diese Unterschale abbricht und nicht die primäre ...
Aber gibt es eine Möglichkeit, eine Funktion zu schreiben, die die gesamte Ausführung abbricht, egal wie sie aufgerufen wird? Ich muss nur den tatsächlichen Rückgabewert ermitteln (von der Funktion bestätigt).
setsid()
Funktion gedacht , aber sie funktioniert nicht ganz so. Aktualisiert, um densetsid
Befehl nicht zu verwenden , da wir einen neuen Prozess starten müssten.abort 2
würde dastrap "exit 2" TERM
vorher tunkill
?tempfile
, um einen Ort zum Speichern des Codes in der oberen Shell auszuwählen. Lassen Sie dann die Shell, die gerade beendet wird, den Code in diese Datei schreiben und lesen Sie dann einfach den Handler des übergeordneten Elements ein.set -E
hierSie können
set -e
die Exits verwenden, wenn ein Befehl mit einem Status ungleich Null beendet wird :set -e func set +e
Oder holen Sie sich den Rückgabewert:
(func) || exit $?
quelle
res=$(func) || exit
exit
. Die Funktion könnte einfach zurückkehren. / Wennset -e
dies jedoch global festgelegt ist, ist dies sinnvollAber gibt es eine Möglichkeit, eine Funktion zu schreiben, die die gesamte Ausführung abbricht, egal wie sie aufgerufen wird?
Nein.
Ich muss nur den tatsächlichen Rückgabewert ermitteln (von der Funktion bestätigt).
Sie können
res=$(func) echo $?
quelle
Ich denke besser ist
#!/bin/bash set -e trap "exit 1" ERR myfunc() { set -x # OPTIONAL TO SHOW ERROR echo "Exit with failure" set +x # OPTIONAL exit 1 } echo "BEFORE..." myvar="$(myfunc)" echo "AFTER..But not shown"
quelle
Ein untergeordneter Prozess kann den übergeordneten Prozess nicht implizit zum Schließen zwingen. Sie müssen eine Art Signalmechanismus verwenden. Zu den Optionen kann ein spezieller Rückgabewert gehören oder ein Signal mit
kill
etwas wie gesendet werdenfunction child() { local parent_pid="$1" local other="$2" ... if [[ $failed ]]; then kill -QUIT "$parent_pid" fi }
quelle