Я использовал оператор exit 1 в своих функциях bash для завершения всего скрипта, и он работал нормально:
function func()
{
echo "Goodbye"
exit 1
}
echo "Function call will abort"
func
echo "This will never be printed"
Но потом я понял, что он не работает, когда его называют:
res=$(func)
Я понимаю, что я создал подоболочку, и "exit 1" прерывает эту подоболочку, а не основную ....
Но есть ли способ написать функцию, которая прерывает все выполнение, независимо от того, как она вызывается? Мне просто нужно получить реальное возвращаемое значение (отраженное функцией).
setsid()
функции C , но она работает по-другому. Обновлено, чтобыsetsid
команда не использовалась , так как она потребовала бы от нас запуска нового процесса.abort 2
будет делатьtrap "exit 2" TERM
до тогоkill
?tempfile
выберите место для хранения кода в верхней оболочке, затем заставьте оболочку, которая выходит, записать код в этот файл, а затем просто прочитать в родительском обработчике.set -E
здесьВы можете использовать
set -e
which exit, если команда завершает работу с ненулевым статусом :set -e func set +e
Или возьмите возвращаемое значение:
(func) || exit $?
источник
res=$(func) || exit
exit
в первую очередь нет смысла использовать . функция могла просто вернуться. / однако, еслиset -e
он установлен глобально, это имеет смыслДочерний процесс не может принудительно закрыть родительский процесс неявно. Вам нужно использовать какой-то сигнальный механизм. Параметры могут включать специальное возвращаемое значение или, возможно, отправку некоторого сигнала
kill
, напримерfunction child() { local parent_pid="$1" local other="$2" ... if [[ $failed ]]; then kill -QUIT "$parent_pid" fi }
источник
Я думаю, лучше
#!/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"
источник
Но есть ли способ написать функцию, которая прерывает все выполнение, независимо от того, как она вызывается?
Нет.
Мне просто нужно получить реальное возвращаемое значение (отраженное функцией).
Вы можете
res=$(func) echo $?
источник