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, но не нашел подходящего ответа.
set -e
, но внутри функции. Другой вопрос просто спрашивает о подобном удивительном поведении. У этого вопроса гораздо больше голосов, звезд, просмотров и полезных ответов, охватывающих различные альтернативы, и я думаю, что имеет гораздо больше смысла оставлять его открытым, чем другой. Если что, пометьте дубликат наоборот. - person Robie Basak   schedule 23.03.2018set -e
с ловушкой DEBUG. См. мой ответ ниже: stackoverflow.com/a/62707941/2668666 - person jmrah   schedule 03.07.2020