2009-02-20 11 views

risposta

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

Come sottolineato nei commenti, /dev/stdout forza funziona meglio di /dev/tty in alcune circostanze.

+0

_A_w_e_s_o_m_e_. Grazie. –

+3

Cosa sta facendo/dev/tty? La domanda originale voleva l'output sullo standard output, non necessariamente sul terminale. –

+4

/dev/tty è un sinonimo per il terminale corrente. L'intervistatore usava "standard out" nel modo abituale per indicare il terminale corrente, piuttosto che una definizione più restrittiva del termine. –

16

Buona tazza di tee!

Le copie comando tee di input standard di sullo standard output e anche a qualsiasi file specificati come argomenti. Questo è utile quando si desidera non solo inviare alcuni dati in una pipe, ma anche per salvare una copia

Come sto avendo un lento pomeriggio, ecco qualche ascii-art gloriosamente illustrativo ...

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

Come greyfade dimostra in un'altra risposta il 'file' non c'è bisogno di essere un file normale, ma potrebbe essere FIFO che ti permette di tubo che tee'd output in un terzo comando.

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

Ma voglio gzip il file intermedio al volo.È possibile solo usando il tee? –

+0

sì, l'altro paul ha scritto un bel succinto rispondi mentre mi incasina con un diagramma di arte ascii :) –

+1

Ma +1 per l'eccellente spiegazione. –

46

Un altro modo (supponendo un guscio come bash o zsh):

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

Il certamente strana >() sintassi fondamentalmente esegue le seguenti operazioni:

  • Crea nuovo FIFO (di solito qualcosa in /tmp/
  • Esegui comando all'interno di () e b ind FIFO per lo stdin su quel sottocomando
  • Restituisce il nome file FIFO alla riga di comando.

Cosa tee finisce vedere, poi, è qualcosa di simile:

tee /tmp/arjhaiX4 

Tutto gzip vede è il suo standard input.

Per Bash, vedere man bash per dettagli. È nella sezione redirection. Per Zsh, vedi man zshexpn sotto l'intestazione "Sostituzione del processo".

Per quanto posso dire, la Shell Korn, le varianti della classica Bourne Shell (inclusi ash e dash) e la Shell C non supportano questa sintassi.

+0

Cool, sto imparando qualcosa da me qui. Puoi approfondire cosa sta succedendo lì? –

+0

I'll modificare il mio post. – greyfade

+0

se l'ho letto bene, invece di dare un file a tee, hai inviato la copia come input a un'espressione tra parentesi che scrive l'output gzip in un altro file. I dati non compressi lasciano tee normalmente sullo stdout –

6

Proprio per inviare un modo che non coinvolge disco toccante:

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

Cosa vuoi dire/tmp è su un disco?!?!?!? – SamB

+0

Dal punto di vista della sicurezza, lo è. – Joshua

Problemi correlati