Подтвердить что ты не робот

Как отменить захват после команды 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, похоже, не отключает ловушку. Любые другие способы "развязать", а затем "перехватить"?

4b9b3361

Ответ 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