Я использую, set -e
чтобы остановить скрипт bash при первой ошибке .
Все работает хорошо, если я не использую команду с &&
:
$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$
по сравнению с:
$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$
Первый пример все еще повторяет I'm running!
, но второй нет. Почему они ведут себя по-разному?
UPD. Аналогичный вопрос: /programming/6930295/set-e-and-short-tests
bash
shell-script
shell
девятьсот седьмой
источник
источник
cd
командыset -e
поведение удивительно.Ответы:
Это документированное поведение. Страница руководства bash (1) гласит
set -e
:И POSIX Shell Command Language Specification подтверждает , что это правильное поведение:
и Раздел 2.9.3 Списки этого документа определяют
источник
set -e
Опция не имеет эффект в некоторых ситуациях, и это стандартное поведение и переносят на совместимой оболочке POSIX.Ошибка команды является частью конвейера:
будет печатать
printed
.И только отказ самого трубопровода считается:
ничего не напечатает.
Неудачная команда запуска в списке соединения после
while
,until
,if
,elif
зарезервированное слово, трубопровод , начиная с!
зарезервированным словом, или какой - либо команды в составе&&
или||
списка , за исключением последнего:Последняя команда терпит неудачу, все еще
set -e
влияет на:Не работает подоболочка в составной команде:
источник
echo "printed"
иecho "not_printed"
в ваших примерах (а неecho 1
).set -e
вызывает выход в(false && true); echo not here
, но не в{ false && true; }; echo here
, хотя YMMV с различными оболочками и даже разными версиями одной оболочки. Я не стал бы касатьсяset -e
столба баржи и вместо этого делал бы правильную обработку ошибок.я предполагаю, что если-то состояние в целом оценивается как истинное.
Я старался
кто дает
Код ошибки перехватывается условием if, поэтому bash не будет запускать конец выполнения.
источник
if ... fi