Bash скрипт с `set -e` не останавливается при команде `... && ...`

Не нужно ничего сложного, вы можете установить пакет прошивки напрямую с помощью apt.

Команды для установки микропрограммы:

sudo apt-get update
sudo apt-get install firmware-iwlwifi

Команды для перезагрузки драйвера:

sudo modprobe -r iwlwifi
sudo modprobe iwlwifi
13
23.05.2017, 15:39
3 ответа

Это задокументированное поведение. В справочной странице bash(1) говорится, что для set-e ,

оболочка не завершает работу, если команда не удалась является частью списка команд сразу после ключевого слова while или until, часть теста, следующая за зарезервированными словами if или elif, часть любой команды, выполняемой в списке && или || , за исключением команды, следующей за последним && или ||, любая команда в конвейере, кроме последней, или если возвращаемое значение команды инвертируется с помощью ! .
[Выделение добавлено.]

И Спецификация POSIX командного языка оболочки подтверждает, что это правильное поведение:

Установка -e должна игнорироваться при выполнении составного списка после зарезервированного слова while, до ,if или elif, конвейер, начинающийся с ! зарезервированное слово, или любая команда списка И-ИЛИ, кроме последней.

и Раздел 2.9.3 Списки этого документа определяют

Список И-ИЛИ представляет собой последовательность одного или нескольких конвейеров. разделенные операторами "&&" и "||".

13
27.01.2020, 19:53

Я предполагаю, что условие «если-то» в целом оценивается как истинное.

Я попробовал

set -e
if cd not_existing_dir
then  echo 123
fi
echo "I'm running! =P"

, кто дает

-bash: cd: not_existing_dir: No such file or directory
I'm running! =P

код ошибки, перехватываемый условием if, таким образом bash не вызовет окончание выполнения.

2
27.01.2020, 19:53

Параметр set -e не действует в некоторых ситуациях, и это стандартное поведение и переносимое в оболочку POSIX.


Неудачная команда является частью конвейера:

false | true; echo printed

будет печатать printed.

И только провал самого трубопровода рассматривается:

true | false; echo 'not printed'

ничего не напечатает.


Команда failed запускается в составном списке после зарезервированного слова while, till, if, elif конвейера, начинающегося с ! зарезервированное слово, или любую команду как часть && или || Список , кроме последнего:

false || true; echo printed

Последняя команда по-прежнему не выполняет ошибку set -e:

true && false; echo 'not printed'

Подоболочка завершается ошибкой в составной команде:

(false; echo 'not printed') | cat -; echo printed
10
27.01.2020, 19:53

Теги

Похожие вопросы