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, но без подходящего ответа.