¿Hay alguna manera de canalizar la salida de un progtwig en otros dos progtwigs?

Lo siento si esta es una pregunta tonta, pero estoy tratando de lograr algo como esto, pero en una línea:

$ prog1 | prog2 $ prog1 | prog3 

Entonces, básicamente quiero ejecutar prog1 y canalizar la salida a prog2 y prog3 por separado (no a una tubería encadenada). Al principio, estaba tratando de usar tee pero eso no parecía correcto porque estaba volcando salida a un file (que no es lo que quiero).

 $ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2" 

En algún momento, probablemente quiera extender esto para conectar la salida a más de dos progtwigs, pero estoy empezando de manera simple por ahora.

 $ prog1 | prog2 $ prog1 | prog3 $ prog1 | prog4 ... 

Sustitución de processs

 ... | tee >(prog2) | ... 

De forma similar a la respuesta de Ignacio, puede usar un tubo con nombre temporal usando mkfifo(1) .

 mkfifo /tmp/teedoff.$$; cmd | tee /tmp/teedoff.$$ | prog2 & sleep 1; prog3 < /tmp/teedoff.$$; rm /tmp/teedoff.$$ 

Es un poco más detallado, pero funcionaría en sistemas que no tienen sustitución de process, como el dash . El sleep 1 es para manejar cualquier condición de carrera.

Hay un pequeño service público que hace el trabajo:

 prog1 | ptee 2 3 4 2> >(prog2) 3> >(prog3) 4> >(prog4) 

En lugar de escribir en files, ptee escribe a todos los fds que se dan en la línea de command.

ptee es parte de pipexec .

No necesita bashisms o files especiales o cualquiera de eso – no en Linux de todos modos:

 % { prog1 | tee /dev/fd/3 | prog2 >&2 ; } 3>&1 | prog3 { { printf %s\\t%s\\t%s\\n \ "this uneven argument list" \ "will wrap around" to \ "different combinations" \ "for each line." "Ill pick out" \ "a few words" "and grep for them from" \ "the same stream." | tee /dev/fd/3 /dev/fd/4 | grep combination >&2 ; } 3>&1 | grep pick >&2 ; } 4>&1 | grep line different combinations for each *line.* Ill pick out different combinations for each line. Ill *pick* out different *combinations* for each line. Ill pick out 

Destaqué los resultados grep resaltados para mí para mostrar que no solo eran tres resultados de la misma transmisión, sino que también eran el resultado de coincidencias separadas del process grep .