Как получить эффект и бесполезность «set -e» внутри функции оболочки?

set -e (или сценарий, начинающийся с #! / Bin / sh -e ) чрезвычайно полезен для автоматического отключения при возникновении проблемы. Это избавляет меня от необходимости проверять каждую команду, которая может завершиться ошибкой.

Как мне получить эквивалент этого внутри функции?

Например, у меня есть следующий сценарий, который немедленно завершает работу при ошибке со статусом выхода из ошибки :

#!/bin/sh -e

echo "the following command could fail:"
false
echo "this is after the command that fails"

Результат такой, как ожидалось:

the following command could fail:

Теперь я хотел бы обернуть это в функцию:

#!/bin/sh -e

my_function() {
    echo "the following command could fail:"
    false
    echo "this is after the command that fails"
}

if ! my_function; then
    echo "dealing with the problem"
fi

echo "run this all the time regardless of the success of my_function"

Ожидаемый результат:

the following command could fail:
dealing with the problem
run this all the time regardless of the success of my_function

Фактический результат:

the following output could fail:
this is after the command that fails
run this all the time regardless of the success of my_function

(т.е. функция игнорирует set -e )

Это предположительно ожидаемое поведение. Мой вопрос: как получить эффект и бесполезность set -e внутри функции оболочки? Я' я бы хотел иметь возможность настроить что-то такое, чтобы мне не приходилось индивидуально проверять ошибки при каждом вызове, но скрипт остановится при обнаружении ошибки. Он должен раскручивать стек до тех пор, пока я не проверю результат, или выйти из самого скрипта, если я его не проверял. Это то, что уже делает set -e , за исключением того, что он не является вложенным.

Я нашел тот же вопрос , заданный вне Stack Overflow, но без подходящего ответа.

32
задан Robie Basak 15 November 2018 в 14:08
поделиться