A resposta geral é não. É possível prog2
sair antes prog1
mesmo do início (obviamente isso não pode acontecer se, prog2
na verdade, você ler alguma entrada, o que você esperaria que estivesse fazendo se estiver usando em um pipeline). Definitivamente, é possível prog2
sair antes prog1
; isso acontece, por exemplo, quando prog2
é um programa de pesquisa que sai assim que encontra uma correspondência, caso em que prog1
ainda não terminou de produzir todos os dados.
Não há uma maneira direta prog2
de recuperar o status de saída prog1
ou até mesmo saber que prog1
saiu. Tudo o que prog2
podemos saber é que prog1
fechou a extremidade do tubo, o que pode ser feito sem morrer.
Se você quiser obter o status de saída prog1
de 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)}
'