Общий ответ - нет. Это возможно для 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)}
'