Почему sh с errexit не работает со списком команд? - PullRequest
8 голосов
/ 16 мая 2019

Если я запускаю следующий скрипт оболочки как обычный пользователь, он прерывается на третьей строке, как и ожидалось:

set -o errexit

echo foo > /bar
echo $?

Вот вывод:

$ sh test1.sh 
test.sh: 3: test.sh: cannot create /bar: Permission denied

Однако, если команда echo является частью составного списка, выполнение продолжается после сбойной команды и печатает код выхода:

set -o errexit

{ echo foo; } > /bar
echo $?

Вот вывод:

$ sh test2.sh 
test.sh: 3: test.sh: cannot create /bar: Permission denied
2

Почему сценарий не прерывается? С другой стороны, если я заменю фигурные скобки на круглые скобки, это будет работать так, как я ожидал.

1 Ответ

3 голосов
/ 16 мая 2019

Спецификация POSIX гласит, что оболочка «может выйти», если возникает ошибка перенаправления с составной командой .

bash выбирает выход, если составная команда является командой подоболочки((...)), но в противном случае выбирает не.Я не знаю обоснования этого различия;это может быть историческим по своей природе.

set -e имеет много причуд и часто не будет вести себя так, как вы ожидаете.Многие люди советуют вам просто не использовать его.

...