Привет. Сегодня про хитрости с пайпами и кодами завершения. Максимально упрощаю, чтобы стало понятнее.

Собираем такую команду:

false | true

Если после её выполнения сделать echo $?, то получим статус выхода 0. То есть у нас есть статус завершения именно команды true. Но как теперь узнать, с каким кодом завершилась первая команда false?

А вот так, модифицируем команду:

false | true; (exit ${PIPESTATUS[0]})
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
В этом случае будет получен код завершения 1, который справедлив для команды false.

Как ты можешь заметить, если в PIPESTATUS изменить [0] на [1], мы снова получим статус завершения 0, то есть для true.

Аналогично можно манипулировать любой частью пайпа и получать нужные тебе статусы.

command1 | command2 | command3
echo "${PIPESTATUS[0]}"
echo "${PIPESTATUS[1]}"
echo "${PIPESTATUS[2]}"
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Есть ещё много велосипедов для реализации желаемого, но этот коробочный — самый распространённый и понятный. Изучай!

Больше про коды завершения можешь найти в этом посте.