Как расправиться после команды ловушки
У меня есть сообщение об ошибке следующим образом:
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
В целом, мне нужно игнорировать ловушку во время выполнения команды 4_which_expected_error
Set +e, похоже, не отключает ловушку. Есть ли другие способы "развязать", а затем "перехватить"?
3 ответа
Вот что вы можете найти в руководстве по ловушке:
KornShell использует ловушку ERR, которая срабатывает всякий раз, когда набор -e вызывает выход.
Это означает, что это не вызвано set -e
, но выполнен в тех же условиях. Добавление set -e
чтобы ловушка на ERR заставила ваш скрипт завершиться после выполнения ловушки.
Чтобы удалить ловушку, используйте:
trap - [signal]
Вы можете использовать это trap
сбросить trap
установить ранее:
trap '' ERR
Чтобы игнорировать сбой команды, которая, как вы знаете, потерпит неудачу, вы можете заставить строку всегда успешно завершаться, добавляя || 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
Чтобы отключить все захваченные сигналы, вы можете запустить "trap - signal" в цикле:
trap | awk '{ print $NF }' | while read SIG ; do trap - $SIG ; done