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


Quiero ejecutar un comando, el resultado de ese comando get gzip había sobre la marcha, y también echo/tee de salida la salida de ese comando.

Es decir, algo como:

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

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

hey hey, we're the monkees
Author: SamB, 2009-02-20

4 answers

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

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

 43
Author: Paul Tomblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-27 01:02:08

De otra manera (asumiendo un shell como bash o zsh):

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

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

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

Lo que tee termina viendo, entonces, es algo como:{[12]]}

tee /tmp/arjhaiX4

All gzip sees es su entrada estándar.

Para Bash, ver man bash para más detalles. Está en la sección sobre la redirección . Para Zsh, véase man zshexpn bajo el epígrafe "Sustitución de procesos."

Por lo que puedo decir, el Korn Shell, las variantes del clásico Bourne Shell (incluyendo ash y dash), y el Shell C no soportan esta sintaxis.

 51
Author: greyfade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-21 18:03:53

Tener una buena taza de tee!

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

Como estoy teniendo una tarde lenta, aquí hay un arte ascii 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 normal, pero podría ser FIFO permitiéndole canalizar esa salida tee'd en un tercer comando.

           +-----+                   +---+                  +-----+  
stdin ->   |cmd 1|    -> stdout ->   |tee|   ->  stdout  -> |cmd 2|
           +-----+                   +---+                  +-----+
                                       |
                                       v
                                     FIFO
                                       |
                                       v
                                    +-----+
                                    |cmd 3|
                                    +-----+
 17
Author: Paul Dixon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-20 20:23:58

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)
 6
Author: Joshua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-04 22:52:09