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)}
'