Конвейер вернул 0 — а производитель оборвался
Конвейер вернул 0 — а производитель оборвался Читатель взял одну строку и вышел с 0. Запись производителя после закрытия всех читающих дескрипторов вызывает SIGPIPE; по умолчанию процесс завершается. Вымышленный пример, отдельный Bash-скрипт в Linux; SIGPIPE не игнорируется и не обрабатывается: gen() { for ((i=0; i<100000; i++)); do printf '%s\n' "$i"; done; } consume() { read -r first; return 0; } set +e set +o pipefail gen | consume printf 'rc=%s; steps=%s\n' "$?" "${PIPESTATUS[*]}" set -o pipefail gen | consume printf 'rc=%s; steps=%s\n' "$?" "${PIPESTATUS[*]}" Если gen завершён SIGPIPE (13), Bash показывает 141. Тогда ожидается без pipefail: rc=0; steps=141 0, с ним: rc=141; steps=141 0. Это условные результаты. Сам код 141 сигнал не доказывает. Без pipefail итог — статус последнего шага; с ним — крайнего справа неуспешного, либо 0. Здесь errexit отключён: следующая команда выполняется. PIPESTATUS снимайте сразу, до другой команды. Здесь он и $? раскрываются в одном printf до выполнения. Развилка: одна строка задумана? SIGPIPE может быть штатным. Нужен весь поток? Ищите причину выхода читателя. Ошибка — судить по последнему шагу. Используйте pipefail, где важен каждый шаг. Сохраните проверку для практического разбора Linux при подготовке обучения в УЦ ФОРС. #Linux #Bash #УЦФОРС VK | Телеграм | Сайт