Как расправиться после команды ловушки

У меня есть сообщение об ошибке следующим образом:

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
Другие вопросы по тегам