linux tuberia ¿Cómo puedo gzip estándar en un archivo y también imprimir estándar en estándar?




tee tuberia (4)

¡Ten una buena taza de !

El comando tee copia la entrada estándar a la salida estándar y también a cualquier archivo dado como argumentos. Esto es útil cuando no solo desea enviar algunos datos por un conducto, sino también para guardar una copia

Como estoy teniendo una tarde lenta, aquí hay un ascii-arte gloriosamente ilustrativo ...

           +-----+                   +---+                  +-----+  
stdin ->   |cmd 1|    -> stdout ->   |tee|   ->  stdout  -> |cmd 2|
           +-----+                   +---+                  +-----+
                                       |
                                       v
                                     file

Como Greyfade demuestra en otra respuesta, el 'archivo' no necesita ser un archivo regular, pero podría ser FIFO lo que le permite canalizar esa salida en tee a un tercer comando.

           +-----+                   +---+                  +-----+  
stdin ->   |cmd 1|    -> stdout ->   |tee|   ->  stdout  -> |cmd 2|
           +-----+                   +---+                  +-----+
                                       |
                                       v
                                     FIFO
                                       |
                                       v
                                    +-----+
                                    |cmd 3|
                                    +-----+

Quiero ejecutar un comando, hacer que la salida de ese comando obtenga gzip'd sobre la marcha, y también eco / salida de salida de ese comando.

es decir, algo así como:

echo "hey hey, we're the monkees" | gzip --stdout > my_log.gz

Excepto cuando la línea se ejecuta, quiero ver esto en estándar:

hey hey, we're the monkees

echo "hey hey, we're the monkees" | tee /dev/tty | gzip --stdout > my_log.gz

Como se señaló en los comentarios, /dev/stdout podría funcionar mejor que /dev/tty en algunas circunstancias.


Solo para publicar una forma que no implique tocar el disco:

echo "hey hey, we're the monkees" | (exec 1>&3 && tee /proc/self/fd/3 | gzip --stdout > my_log.gz)

Otra forma (asumiendo un shell como bash o zsh ):

echo "hey hey, we're the monkees" | tee >(gzip --stdout > my_log.gz)

La sintaxis admitidamente extraña >() básicamente hace lo siguiente:

  • Crear nuevo FIFO (generalmente algo en /tmp/ )
  • Ejecute el comando dentro () y enlace el FIFO a stdin en ese subcomando
  • Devuelve el nombre de archivo FIFO a la línea de comando.

Lo que termina viendo, entonces, es algo como:

tee /tmp/arjhaiX4

Todos los gzip ve son su entrada estándar.

Para Bash, vea man bash para más detalles. Está en la sección de redirección . Para Zsh, vea man zshexpn bajo el encabezado "Sustitución de procesos".

Por lo que puedo decir, el Korn Shell, las variantes del clásico Bourne Shell (incluyendo cenizas y guiones) y el C Shell no son compatibles con esta sintaxis.





tee