
A veces quiero insertar algo en una canalización para generar informes o algún otro uso secundario. Podría ser tan simple como wc -l
, o algo más complejo como una bestia awk
o incluso un script en Python. Sería bueno ejecutar una canalización como esta:
zcat my_data_file.gz \
| wc -l > /tmp/linecount
| process_data.py
El problema es que la mayoría de las utilidades no corrigen los datos a la salida estándar. tee
Puedo escribir los datos en un archivo temporal, pero luego tengo que esperar hasta que todo esté hecho:
zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py && \
wc -l /tmp/f > /tmp/linecount && rm /tmp/f
Esto no es óptimo: puede ser un proceso de muy largo plazo; Es posible que desee ver resultados intermedios del análogo wc
antes; y es posible que no desee almacenar todos los datos en un archivo temporal.
Respuesta1
Puede utilizar tee
y procesar la sustitución >(...)
para esto:
zcat my_data_file.gz |
# Count number of lines in stream
tee >(wc -l > /tmp/linecount) |
# Further processing
process_data.py
Tenga en cuenta que las canalizaciones se pueden utilizar para la continuación de líneas y que los comentarios se pueden intercalar entre los comandos, una característica interesante al crear canalizaciones complicadas.
Respuesta2
No es del todo eficiente, pero puedes lograrlo contuberías con nombre, que puedes crear conmkififo(1)
Para el ejemplo de la pregunta:
mkfifo /tmp/f
wc -l /tmp/f > /tmp/linecount &
zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py &
wait
rm /tmp/f
Tenga en cuenta lo &
adjunto a ambos wc
y a la tubería; esto significa que el shell enviará las tareas a un segundo plano. La llamada a wait
luego espera a que concluyan todas las tareas en segundo plano. Ambos procesos finalizarán aproximadamente al mismo tiempo.
Tenga en cuenta que si uno de sus procesos es sustancialmente más lento, podría ralentizar todo significativamente, ya que tee
puede bloquearse en su canal de salida estándar o en el canal con nombre en el que está escribiendo.Editar: Además, ahora tiene más modos de falla, ya que la T saldrá debido a una tubería rota si falla el proceso secundario.