Як скасувати ефект "set -e", який робить невідкладний вихід bash, якщо якась команда не працює?


205

Після введення set -eв інтерактивну оболонку bash, bash негайно вийде, якщо будь-яка команда завершиться з ненульовим. Як я можу скасувати цей ефект?

Відповіді:


309

З set +e. Так, назад ви вмикаєте параметри оболонок set -і відключаєте їх set +. Історичні родзинки, донхаун.


Дуже дякую, що це одна з останніх рядків відповідної сторінки керівництва ( faqs.org/docs/bashman/bashref_56.html ), яку я не прочитав до кінця.
Тіані Куй

Посібник з башма надзвичайно величезний, це правда. (FYI, оскільки ви здаєтесь новим: це зроблено, щоб натиснути галочку під найкращою відповіддю на ваше запитання, це називається "її прийняття".)
zwol

12
На жаль, мова оболонки Unix (більшість з яких не характерна для "bash") є однією з найменш внутрішньо послідовних мов програмування, яка все ще широко використовується. Вам доведеться дізнатися набагато більше цих маленьких бородавок. І я б сказав, що це помилка в документації.
zwol

10
історичний виноград - це родзинка пекла!
Джеймс

2
Нарешті, несправедливе баштинг Bash: одиночний тире є стандартним варіантом командного рядка оболонки POSIX, і тому найбільш природно для "робити щось". +це як, -але перетин через щось означає «не», як у «≠».
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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 || :

Сподіваюсь, це допомагає!


11
Цікавився історією :та знайшов тут свою відповідь , на випадок, якщо хтось цікавий.
3cheesewheel

4
Це стосується лише тих випадків, коли вам небайдужий код повернення запущеної команди.
Ісаак

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.