A resposta geral é não. É possível que prog2 saia antes que prog1 seja iniciado (obviamente, isso não pode acontecer se prog2 realmente ler alguma entrada, o que você esperaria que fizesse se estivesse sendo usada em um pipeline). É definitivamente possível que prog2 saia antes de prog1 ; isso acontece por exemplo quando prog2 é um programa de pesquisa que sai assim que encontra uma correspondência, caso em que prog1 pode não ter terminado de produzir todos os dados ainda.
Não há nenhuma maneira direta de prog2 recuperar o status de saída de prog1 ou mesmo saber que prog1 foi encerrado. Tudo o que o prog2 pode saber é que prog1 fechou a ponta do tubo, o que ele pode fazer sem morrer.
Se você deseja obter o status de saída de prog1 de prog2 , há dois métodos comuns: você pode gravá-lo em um arquivo ou enviá-lo pelo canal. Enviar o status de saída como a última linha dos dados enviados é uma possibilidade. Você precisa se certificar de não processar a última linha até saber que é a última linha, ou seja, até tentar ler a próxima linha.
{ prog1; echo $?; } | …
Veja um exemplo em que o lado direito é um filtro de texto que colore todas as linhas que contêm a palavra "erro" em vermelho. Se o lado esquerdo falhar, o lado direito sai com o mesmo status.
{ prog1; echo $?; } | awk '
NR != 1 {
if (line ~ /[Ee][Rr][Rr][Oo][Rr]/) print "3[31m" line "3[0m";
else print line;
}
{line = $0}
END {exit($0)}
'