Si entiendo correctamente, está buscando el equivalente de tee file1 file2 file3
, pero en lugar de escribir los mismos datos en tres archivos file1
, file2
y file3
desea canalizar los mismos datos en tres comandos cmd1
, cmd2
y cmd3
, es decir
… | ??? cmd1 cmd2 cmd3
debe ser equivalente a
… | cmd1 &
… | cmd2 &
… | cmd3 &
excepto que …
solo se ejecutaría una vez.
Hay dos maneras de hacerlo.
Ksh93, bash y zsh admiten la sustitución de procesos . Esta es una generalización de canalizaciones que permite que el argumento de un comando sea un archivo que, cuando se escribe, pasa datos como entrada a un comando (también existe la variante de entrada que, cuando se lee, obtiene la salida de datos mediante un comando) . Es decir,
echo hello | tee >(cmd1)
grabados hello
en la salida estándar y, además, se ejecuta cmd1
con hello
como entrada.
Entonces, por ejemplo, si desea duplicar la entrada de somecommand
y pasarla a ambos cmd1
y cmd2
, puede usar
somecommand | tee >(cmd1) | cmd2
Si su shell no admite la sustitución de procesos, puede utilizar canalizaciones con nombre. Vea la respuesta de Arcege para saber cómo funciona. Las canalizaciones con nombre son menos convenientes que la sustitución de procesos porque debe crearlas y eliminarlas, e iniciar y sincronizar procesos manualmente. Tienen la ventaja de ser totalmente portátiles, mientras que no todos los shells admiten sustituciones de procesos. También se pueden usar en escenarios distintos de aquellos para los que es la sustitución de procesos.
Bajo el capó, en algunos sistemas, la sustitución de procesos utiliza tuberías con nombre internamente. Sin embargo, en la mayoría de los sistemas, se basa en archivos con nombre que representan descriptores de archivos .