2009-02-20 12 views

Respuesta

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

Como se señaló en los comentarios, /dev/stdout poder funciona mejor que /dev/tty en algunas circunstancias.

+0

_A_w_e_s_o_m_e_. Gracias. –

+3

¿Qué está haciendo/dev/tty allí? La pregunta original quería la salida en salida estándar, no necesariamente en la terminal. –

+4

/dev/tty es un sinónimo de la terminal actual. El que pregunta utilizó "estándar fuera" de la manera habitual para significar la terminal actual, en lugar de una definición más estricta del término. –

16

¡Tenga una buena taza de tee!

Las copias camiseta comando de entrada estándar a la salida estándar y también a cualquier archivos dados como argumentos. Esta es útil cuando se desea no sólo para enviar algunos datos por un tubo, sino también a guardar una copia

Como estoy pasando una tarde lenta, aquí hay algo de ascii-art ilustrativo gloriosamente ...

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

Como greyfade demuestra en otra respuesta al 'archivo' no necesita ser un archivo normal, pero podría ser FIFO que dejar que la tubería tee de salida en un tercer comando.

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

Pero quiero descomprimir el archivo intermediario sobre la marcha. ¿Es posible solo con tee? –

+0

sí, el otro paul escribió un bonito resumen responde mientras me metí con un diagrama de ascii art :) –

+1

Pero +1 para la excelente explicación. –

46

Otra forma (suponiendo una concha como bash o zsh):

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

La sintaxis es cierto extraño >() básicamente hace lo siguiente:

  • crear nuevas FIFO (por lo general algo en /tmp/)
  • Ejecutar el comando dentro de () yb ind la FIFO para stdin en ese subcomando
  • Devuelve el nombre de archivo FIFO a la línea de comando.

Lo tee acaba de ver, entonces, es algo así como:

tee /tmp/arjhaiX4 

Todo gzip ve es su entrada estándar.

Para Bash, vea man bash para más detalles. Está en la sección en redirection. Para Zsh, consulte man zshexpn bajo el título "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.

+0

Genial, estoy aprendiendo algo aquí mismo. ¿Puedes dar más detalles sobre lo que está sucediendo allí? –

+0

Editaré mi publicación. – greyfade

+0

si lo leí bien, en lugar de dar un archivo a tee, lo tienes enviando la copia como entrada a la expresión entre corchetes que escribe la salida de gzip en otro archivo. Los datos sin comprimir dejan la T como es normal en stdout –

6

Sólo para enviar un camino 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) 
+0

¿Qué quiere decir que/tmp está en un disco?!?!?!? – SamB

+0

Desde una perspectiva de seguridad, lo es. – Joshua

Cuestiones relacionadas