A resposta geral é não. É possível prog2sair antes prog1mesmo do início (obviamente isso não pode acontecer se, prog2na verdade, você ler alguma entrada, o que você esperaria que estivesse fazendo se estiver usando em um pipeline). Definitivamente, é possível prog2sair antes prog1; isso acontece, por exemplo, quando prog2é um programa de pesquisa que sai assim que encontra uma correspondência, caso em que prog1ainda não terminou de produzir todos os dados.
Não há uma maneira direta prog2de recuperar o status de saída prog1ou até mesmo saber que prog1saiu. Tudo o que prog2podemos saber é que prog1fechou a extremidade do tubo, o que pode ser feito sem morrer.
Se você quiser obter o status de saída prog1de prog2, há dois métodos comuns: você pode escrevê-lo em um arquivo, ou você pode enviá-lo através do tubo. Enviar o status de saída como a última linha dos dados canalizados é uma possibilidade. Você deve certificar-se de não processar a última linha até saber que é a última linha, ou seja, até tentar ler a próxima linha.
{ prog1; echo $?; } | …
Aqui está 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 "\033[31m" line "\033[0m";
else print line;
}
{line = $0}
END {exit($0)}
'