Команда set -e сразу приводит к сбою сценария bash, когда любая команда возвращает ненулевой код завершения.
Есть ли простой и элегантный способ отключить это поведение для отдельной команды в скрипте?
В каких местах эта функциональность описана в Справочном руководстве по Bash ( http://www.gnu.org/software/bash/manual/bashref.html )?
Альтернативой отмене залога при ошибке может быть навязывание успеха, несмотря ни на что. Вы можете сделать что-то вроде этого:
Это вернет 0 (true), поэтому не следует запускать set -e
источник
faulty_cmd || :
это еще одна популярная идиома для этого. (Команда:
является синонимомtrue
).Если вы пытаетесь перехватить код возврата / ошибки (функция или ответвление), это работает:
источник
Если опция «немедленно покинуть оболочку» применяется или игнорируется, зависит от контекста выполняемой команды (см. Раздел «Справочное руководство по Bash» в Set Builtin - благодаря Arkadiusz Drabczyk).
В частности, эта опция игнорируется, если команда является частью теста в операторе if. Следовательно, можно выполнить команду и проверить ее успех или неудачу в рамках «немедленного выхода из контекста» с помощью следующего оператора:
Можно опустить оператор «then» и использовать меньше строк:
источник
Другой подход, который я считаю довольно простым (и применим к другим
set
опциям в дополнение к-e
):Используйте
$-
для восстановления настроек.Например:
Хотя, в
-e
частности, варианты, которые другие разработали (|| true
или «положили внутрьif
»), могут быть более идиоматичными.источник
У меня недавно был похожий вопрос (хотя я и не писал, я дошел до него), и, насколько я вижу, кажется, что использование set + e перед командой и set -e впоследствии работает наиболее элегантно. Вот пример, получая ответ команды и не позволяя ошибке выбросить ее.
Это захватывает вывод 'fortune', проверяет его состояние выхода, а также повторяет и говорит это. Я думаю, это то, что вы просили, или хотя бы что-то подобное? В любом случае, надеюсь, это поможет.
источник
Мне нравится запускать subshell, если хотите временно что-то изменить. Команда ниже демонстрирует, что первая команда bad_command игнорируется, а вторая прерывает выполнение.
источник