La respuesta general es no. Es posible prog2salir antes prog1incluso de comenzar (obviamente, eso no puede suceder si prog2realmente lee alguna entrada, lo que esperaría que hiciera si lo está usando en una tubería). Definitivamente es posible prog2salir antes prog1; Esto sucede, por ejemplo, cuando se prog2trata de un programa de búsqueda que sale tan pronto como encuentra una coincidencia, en cuyo caso prog1puede que todavía no haya terminado de producir todos los datos.
No hay una forma directa de prog2recuperar el estado de salida prog1o incluso saber que prog1ha salido. Todo lo que prog2puede saber es que prog1ha cerrado su extremo de la tubería, lo que puede hacer sin morir.
Si desea obtener el estado de salida prog1de prog2, hay dos métodos comunes: se puede escribir en un archivo, o se puede enviar a través de la tubería. Enviar el estado de salida como la última línea de los datos canalizados es una posibilidad. Debe asegurarse de no procesar la última línea hasta que sepa que es la última línea, es decir, hasta que haya intentado leer la siguiente.
{ prog1; echo $?; } | …
Aquí hay un ejemplo donde el lado derecho es un filtro de texto que colorea cada línea que contiene la palabra "error" en rojo. Si el lado izquierdo falla, el lado derecho sale con el mismo estado.
{ 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)}
'