Używałem instrukcji „exit 1” w moich funkcjach bash do zakończenia całego skryptu i działało dobrze:
function func()
{
echo "Goodbye"
exit 1
}
echo "Function call will abort"
func
echo "This will never be printed"
Ale potem zdałem sobie sprawę, że nie działa, gdy zostanie wywołany:
res=$(func)
Rozumiem, że utworzyłem podpowłokę i „wyjście 1” przerywa tę podpowłokę, a nie główną…
Ale czy istnieje sposób na napisanie funkcji, która przerywa całą realizację, bez względu na jej wywołanie? Muszę tylko uzyskać prawdziwą wartość zwracaną (powtórzoną przez funkcję).
setsid()
funkcji C , ale nie działa ona w ten sam sposób. Zaktualizowano, aby nie używaćsetsid
polecenia, ponieważ wymagałoby to rozpoczęcia nowego procesu.abort 2
Zrobiłaby totrap "exit 2" TERM
przedkill
?tempfile
wybranie miejsca do przechowywania kodu w górnej powłoce, a następnie pozwól powłoce, która kończy pracę, zapisać kod do tego pliku, a następnie po prostu wczytać w module obsługi rodzica.set -E
tutajMożesz użyć tego,
set -e
który kończy działanie, jeśli polecenie kończy działanie ze stanem niezerowym :set -e func set +e
Lub pobierz wartość zwracaną:
(func) || exit $?
źródło
res=$(func) || exit
exit
w pierwszej kolejności. funkcja może po prostu zwrócić. / jednak, jeśliset -e
jest ustawiony globalnie, ma to sensProces potomny nie może wymusić niejawnego zamknięcia procesu nadrzędnego. Musisz użyć jakiegoś mechanizmu sygnalizacyjnego. Opcje mogą zawierać specjalną wartość zwracaną lub być może wysyłanie jakiegoś sygnału
kill
, coś w rodzajufunction child() { local parent_pid="$1" local other="$2" ... if [[ $failed ]]; then kill -QUIT "$parent_pid" fi }
źródło
Chyba lepiej
#!/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"
źródło
Ale czy istnieje sposób na napisanie funkcji, która przerywa całą realizację, bez względu na jej wywołanie?
Nie.
Muszę tylko uzyskać prawdziwą wartość zwracaną (powtórzoną przez funkcję).
Możesz
res=$(func) echo $?
źródło