set -e
(или script, начинающийся с #!/bin/sh -e
) чрезвычайно полезен для автоматической бомбардировки, если есть проблема. Это избавляет меня от необходимости проверять ошибки каждой отдельной команды, которая может выйти из строя.
Как получить эквивалент этого внутри функции?
Например, у меня есть следующий script, который немедленно выходит из строя с сообщением об ошибке:
#!/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
внутри функции оболочки? Я нашел тот же вопрос, который запрашивал вне Stack Overflow, но не нашел подходящего ответа.