Общий ответ - нет. Это возможно для prog2выхода prog1даже до запуска (очевидно, что это не может произойти, если на prog2самом деле читает какой-то ввод, что вы ожидаете, если он будет использовать его в конвейере). Это определенно возможно для prog2выхода раньше prog1; это происходит, например, когда prog2поисковая программа завершает работу, как только находит совпадение, и в этом случае, prog1возможно, еще не закончены все данные.
Не существует прямого способа prog2получить статус выхода prog1или даже узнать, что prog1он вышел. Все, что prog2может знать, - это то, что prog1закрыл свой конец трубы, что он может сделать, не умирая.
Если вы хотите получить статус выхода prog1из prog2, есть два распространенных метода: вы можете записать его в файл или отправить через канал. Отправка выходного статуса в качестве последней строки переданных данных возможна. Вы должны следить за тем, чтобы не обрабатывать последнюю строку, пока не узнаете, что это последняя строка, т.е. пока вы не попытаетесь прочитать следующую строку.
{ prog1; echo $?; } | …
Вот пример, где правая часть представляет собой текстовый фильтр, который окрашивает каждую строку, содержащую слово «ошибка», в красный цвет. Если левая сторона выходит из строя, правая сторона выходит с тем же статусом.
{ prog1; echo $?; } | awk '
NR != 1 {
if (line ~ /[Ee][Rr][Rr][Oo][Rr]/) print "\033[31m" line "\033[0m";
else print line;
}
{line = $0}
END {exit($0)}
'