Как отменить эффект «set -e», который немедленно завершает работу bash в случае сбоя какой-либо команды?

205

После входа set -eв интерактивную оболочку bash, bash немедленно завершит работу, если какая-либо команда завершится с ненулевым значением. Как я могу отменить этот эффект?

Тяньи Цуй
источник

Ответы:

309

С set +e. Да, обратное, что вы включаете параметры оболочки с помощью set -и отключаете их с помощью set +. Исторический изюм, дончан.

zwol
источник
Большое спасибо, это одна из последних строк соответствующей страницы руководства ( faqs.org/docs/bashman/bashref_56.html ), которую я не прочитал до конца.
Тяньи Цуй
Руководство по bash огромно, это правда. (К вашему сведению, поскольку вы, кажется, новичок: щелкнуть флажок под лучшим ответом на ваш вопрос уже сделано, это называется «принять».)
zwol
12
К сожалению, язык оболочки Unix (большая часть которого не является специфичной для «bash») является одним из наименее внутренне согласованных языков программирования, все еще широко используемых сегодня. Тебе придется выучить гораздо больше этих маленьких бородавок. И я бы сказал, что это ошибка документации.
Звол
10
исторический виноград - это адский изюм!
Джеймс
2
Наконец, несправедливое избиение Bash: single dash является стандартным параметром командной строки оболочки POSIX, и, следовательно, наиболее естественным для «сделать что-то». +это как, -но пересечение чего-то означает «не», как в «≠».
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
68

Это может быть неудобно использовать set +e/ set -eкаждый раз, когда вы хотите переопределить его. Я нашел более простое решение.

Вместо того, чтобы делать это так:

set +e
command_that_might_fail_but_we_want_to_ignore_it
set -e

Вы можете сделать это так:

command_that_might_fail_but_we_want_to_ignore_it || true

или, если вы хотите сохранить нажатия клавиш и не будете немного загадочны:

command_that_might_fail_but_we_want_to_ignore_it || :

Надеюсь это поможет!

szeryf
источник
11
Задавался вопросом об истории :, и нашел здесь мой ответ , на случай, если кому-то еще будет любопытно.
колесное колесо
4
Это применимо, только если вас не волнует код возврата команды, которую вы запускаете.
Исаак