Короткая версия
В скрипте Bash я активирую ловушку, а затем отключаю ее, вызывая trap - EXIT ERR SIGHUP SIGINT SIGTERM
. Когда я делаю деактивацию прямо в скрипте, это работает. Однако когда я помещаю точно такую же строку кода в функцию Bash, она игнорируется, т. Е. Ловушка все еще активируется, если позже команда возвращает код выхода, отличный от нуля. Почему?
Длинная версия
У меня есть куча функций для работы с ловушками:
trap_stop()
{
echo "trap_stop"
trap - EXIT ERR SIGHUP SIGINT SIGTERM
}
trap_terminate()
{
local exitCode="$?"
echo "trap_terminate"
trap_stop
local file="${BASH_SOURCE[1]}"
local stack=$(caller)
local line="${stack% *}"
if [ $exitCode == 0 ]; then
echo "Finished."
else
echo "The initialization failed with code $exitCode in $file:${line}."
fi
exit $exitCode
}
trap_start()
{
echo "trap_start"
trap "trap_terminate $LINENO" EXIT ERR SIGHUP SIGINT SIGTERM
}
При использовании так:
trap_start # <- Trap started.
echo "Stopping traps."
trap_stop # <- Trap stopped before calling a command which exits with exit code 2.
echo "Performing a command which will fail."
ls /tmp/missing
exit_code="$?"
echo "The result of the check is $exit_code."
Я получаю следующий вывод:
trap_start
Stopping traps.
trap_stop
Performing a command which will fail.
ls: cannot access '/tmp/missing': No such file or directory
<b>trap_terminate</b>
trap_stop
<b>The initialization failed with code 2 in ./init:41.</b>
Несмотря на то, что была вызвана функция, отключающая ловушку, ловушка все еще срабатывает при вызове ls
в каталоге, который не существует.
С другой стороны, когда я заменяю вызов на trap_stop
фактическим оператором trap -
, например:
trap_start
echo "Stopping traps."
trap - EXIT ERR SIGHUP SIGINT SIGTERM # <- This statement replaced the call to `trap_stop`.
echo "Performing a command which will fail."
ls /tmp/missing
exit_code="$?"
echo "The result of the check is $exit_code."
, тогда вывод правильный, то есть ловушка не активируется, и я достигаю конец сценария.
trap_start
Stopping traps.
Performing a command which will fail.
ls: cannot access '/tmp/missing': No such file or directory
<b>The result of the check is 2.</b>
Почему перемещение trap -
в функцию перестает работать?