Supongamos que tengo la siguiente tubería:
a | b | c | d
¿Cómo puedo esperar para completar c
(o b
) en sh
o bash
? Esto significa que la secuencia de comandos d
puede iniciarse en cualquier momento (y no es necesario esperar), pero requiere que la salida completa de c
funcione correctamente.
El caso de uso es difftool
para git
comparar imágenes. Es invocado por git
y necesita procesar su entrada (la a | b | c
parte) y mostrar los resultados de la comparación (la d
parte). La persona que llama eliminará la entrada que se requiere para a
y b
. Esto significa que antes de regresar del script, el proceso c
(o b
) debe finalizar. Por otro lado, no puedo esperar d
porque esto significa que estoy esperando la entrada del usuario.
Sé que puedo escribir los resultados c
en un archivo temporal, o tal vez usar un FIFO en bash
. (Sin embargo, no estoy seguro si el FIFO ayudará). ¿Es posible lograr esto sin archivos temporales sh
?
EDITAR
Quizás sería suficiente si pudiera encontrar la identificación del proceso del c
(o b
) proceso de manera confiable. Entonces, toda la tubería podría iniciarse de forma asincrónica, y podría esperar una ID de proceso. Algo en la línea de
wait $(a | b | { c & [print PID of c] ; } | d)
EDITAR ^ 2
He encontrado una solución, los comentarios (o soluciones aún mejores) son bienvenidos.
d
es libre de comenzar cuando lo desee, pero c
debe terminar antes de que pueda seguir adelante.
d
puede comenzar cuando le gusta, ¿qué está esperando exactamente?
d
no utiliza la salida de c
, parece que no tiene sentido formar d
parte de la tubería. Pero si d
usa la entrada, entonces d
debe trabajar un poco en su entrada después de haberla leído todo para que su enfoque marque la diferencia.
d
comenzar a procesarc
la salida solo después de que sec
haya completado? ¿No desead
comenzar a procesar cada línea de salida tal como viene?