La respuesta general es no. Es posible prog2
salir antes prog1
incluso de comenzar (obviamente, eso no puede suceder si prog2
realmente lee alguna entrada, lo que esperaría que hiciera si lo está usando en una tubería). Definitivamente es posible prog2
salir antes prog1
; Esto sucede, por ejemplo, cuando se prog2
trata de un programa de búsqueda que sale tan pronto como encuentra una coincidencia, en cuyo caso prog1
puede que todavía no haya terminado de producir todos los datos.
No hay una forma directa de prog2
recuperar el estado de salida prog1
o incluso saber que prog1
ha salido. Todo lo que prog2
puede saber es que prog1
ha cerrado su extremo de la tubería, lo que puede hacer sin morir.
Si desea obtener el estado de salida prog1
de 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)}
'