Кажется, что опция set -e
в Bash сбрасывается внутри функций, когда эти функции вызываются с помощью расширения $(...)
.
Это меня удивляет, и я не уверен, что это так. ошибка или нет. Я не смог найти описание этого поведения на (обычно довольно тщательной) странице руководства Bash.
Примечание: вот некоторые другие подобные сообщения SO:
Но ни одна из них не имеет отношения к $(...)
, который на самом деле не обсуждается на странице руководства.
Я также не могу найти ссылку на эту проблему в превосходном Bash FAQ 105 .
Вот небольшая программачтобы продемонстрировать проблему:
echo "Initial: $-"
set -eu
echo "After set: $-"
function foo() {
echo "Inside foo: $-"
}
foo
function bar() {
false # I'd expect this to immediately fail
echo "Inside bar: $-"
}
# When a $(...) construct is involved, 'bar' runs to completion!
x=$(bar)
echo "We should never get here ... but we do."
echo "$x"
Для меня, на Bash версии 5.0.11(0)-release
, я получаю следующий вывод:
Initial: hB
After set: ehuB
Inside foo: ehuB
We should never get here ... but we do.
Inside bar: huB
Итак, как вы можете видеть, -u
Опция во всех случаях передается функции. И опция -e
пропускается, когда функция вызывается нормально. Но только в особом случае $(bar)
опция -e
сбрасывается.
Кто-нибудь знает, является ли это документированным поведением или иным образом объяснимым?
Это не имеет смысла для меня(