По умолчанию код завершения конвейера определяется последней командой:
curl -sS "$URL" | jq -r '.version'
Если
curl завершится с ошибкой, но jq успешно обработает пустой ввод, весь конвейер может вернуть код 0. Скрипт решит, что команда выполнилась успешно.Опция
pipefail меняет это поведение:set -o pipefail
Теперь конвейер завершится с ошибкой, если неуспешной была любая его часть:
curl -fsS "$URL" |
jq -r '.version' > version.txt
Коды отдельных команд последнего конвейера можно посмотреть через
PIPESTATUS:curl -fsS "$URL" | jq -r '.version'
printf '%s\n' "${PIPESTATUS[@]}"
В автоматизированных Bash-скриптах часто включают сразу несколько строгих настроек:
set -euo pipefail
-e завершает скрипт при необработанной ошибке, -u запрещает использование необъявленных переменных, а pipefail обнаруживает сбой внутри конвейера.Ожидаемые ошибки при этом лучше обрабатывать явно:
if ! grep -q "READY" health.log; then
echo "Service is not ready"
fi
Добавляйте
pipefail в Bash-скрипты, где ошибка загрузки, сборки или обработки данных не должна остаться незамеченной.➡️ DevOps Ready | #совет
