👁 Если ты строишь сложные пайплайны в прод-скриптах, то знаешь боль: пайп отработал, лог красивый, а на деле одна из команд внутри тихо упала. По умолчанию Bash возвращает код выхода только последней команды в пайпе, и это регулярно маскирует реальные ошибки.
📝 Контроль падений через pipefail и строгий режим
Чтобы пайп не «проглатывал» ошибки, включай строгий режим и pipefail. Тогда скрипт упадёт, если любая команда внутри пайпа завершится с ненулевым кодом. С pipefail код выхода всего пайпа будет ненулевым, если упадёт любая команда внутри. Без него можно получить «успешный» билд с пустым или битым результатом.
#!/usr/bin/env bash set -euo pipefail grep "ERROR" app.log | sort | uniq -c > errors.txt echo "Готово"
📝 Получение кодов выхода всех команд в пайпе
Иногда нужно не просто упасть, а понять, кто именно лёг. Для этого используем массив PIPESTATUS. PIPESTATUS хранит коды выхода всех команд последнего пайпа. Это удобно для тонкой логики ретраев или кастомной обработки ошибок.
#!/usr/bin/env bash
grep "ERROR" app.log | sort | uniq -c > errors.txt
statuses=("${PIPESTATUS[@]}")
echo "grep: ${statuses[0]}"
echo "sort: ${statuses[1]}"
echo "uniq: ${statuses[2]}"📝 Перенаправление stderr без ломания пайпа
Частая задача — логировать stderr отдельно, но не ломать поток stdout. Делается это через процесс-подстановку. Здесь stderr уходит в файл и остаётся в консоли, а stdout продолжает идти по пайпу. Это удобно для прод-скриптов, где важно и логирование, и корректная обработка данных.
#!/usr/bin/env bash set -euo pipefail grep "ERROR" app.log \ 2> >(tee errors.stderr.log >&2) \ | sort | uniq -c
❗️ Если ты пишешь скрипты для CI, деплоя или обработки логов, отсутствие pipefail и контроля кодов выхода — это отложенная прод-авария.
tags: #bash #логирование #полезно



