Продвинутая обработка пайплайнов в Bash

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

bashpipefailpipestatus

👁 Если ты строишь сложные пайплайны в прод-скриптах, то знаешь боль: пайп отработал, лог красивый, а на деле одна из команд внутри тихо упала. По умолчанию 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 #логирование #полезно

🧭 @recura_tech 🌐 VK 🌐 MAX

Скриншот с примерами Bash-кода от RECURA: показываются set -euo pipefail, использование PIPESTATUS и перенаправление stderr вместе с логотипом канала на тёмном фоне.
Скриншот примеров кода: set -euo pipefail, PIPESTATUS и перенаправление stderr.

Читайте так же