Я пишу bash-скрипт и хочу, чтобы он вылетал при первой ошибке. Однако я не могу заставить его сделать это в определенных обстоятельствах, которые я упростил ниже:
#!/bin/bash
set -Exu
bad_command() {
false
#exit 1
echo "NO!!"
}
(set -o pipefail; bad_command | cat ; echo "${PIPESTATUS[@]}; $?") || false
echo "NOO!!"
Ожидаемым поведением будет сбой подоболочки bad_command
, перенесенный на сбой подоболочки ()
, который распространится на сбой внешней оболочки. Но ни один из них не падает, и печатаются оба NO (!?)
Если я раскомментирую оператор exit 1
, то NO больше не печатается, но NOO по-прежнему (!?)
Я пытался явно использовать set -e
внутри каждой из трех оболочек (первая строка в функции, первый оператор после (
, но никаких изменений.
Примечание. Мне нужно выполнить канал внутри подоболочки ()
, потому что это упрощение более сложного сценария. Без подоболочки ()
все работает так, как ожидалось, никаких NO ни с false
, ни с exit 1
.