Как отменить захват после команды trap
У меня есть ловушка ошибки следующим образом:
trap failed ERR
function failed {
local r=$?
set +o errtrace
set +o xtrace
echo "###############################################"
echo "ERROR: Failed to execute"
echo "###############################################"
# invokes cleanup
cleanup
exit $r
}
Есть часть моего кода, где я ожидаю ошибку:
command1
command2
command3
set +e #deactivates error capture
command4_which_expects_error
set -e #re-activates error capture
command5
В целом мне нужно игнорировать ловушку во время выполнения command4_which_expects_error
set + e, похоже, не отключает ловушку. Любые другие способы "развязать", а затем "перехватить"?
Ответы
Ответ 1
Вот что вы можете найти в руководстве по ловушке:
KornShell использует ERR-ловушку, которая запускается всякий раз, когда set -e вызывает выход.
Это означает, что он не запускается set -e
, но выполняется в тех же условиях. Добавление set -e
в ловушку на ERR сделает ваш script выход после выполнения ловушки.
Чтобы удалить ловушку, используйте:
trap - [signal]
Ответ 2
Вы можете использовать этот trap
- reset trap
, установленный ранее:
trap '' ERR
Ответ 3
Чтобы игнорировать сбой команды, которая, как вам известно, не удастся, вы всегда можете добиться успеха, добавив || true
.
Пример:
#!/bin/bash
set -e
failed() {
echo "Trapped Failure"
}
trap failed ERR
echo "Beginning experiment"
false || true
echo "Proceeding to Normal Exit"
Результаты
Beginning experiment
Proceeding to Normal Exit