2013-05-22 6 views
6

A volte voglio esportare il contenuto di una pipe nel mezzo (non lo facciamo tutti?).wierdness using tee: qualcuno può spiegare?

io in genere fare in questo modo (sì, so che ci sono altri, probabilmente migliore, modi):

terminal=$(tty) 
echo hello world |tee $terminal|awk '{print $2, $1}' 

quali uscite

hello world 
world hello 

Che va bene e in tutti gli aspetti bella.

Tranne che mi piacerebbe fare senza creare la variabile $ terminal. Facile, tu dici, basta sostituire 'tee $terminal' con 'tee $(tty)' nella pipe e non c'è bisogno di una variabile? Destra?

Errore.

echo hello world |tee $(tty)|awk '{print $2, $1}' 

uscite

world hello 

In altre parole, la mia uscita dal centro del tubo è stato ingerito.

Ora accetto che questo è sicuramente un primo problema mondiale, ma mi dà fastidio e mi piacerebbe sapere perché la seconda soluzione non funziona.

Chiunque?

+0

+1 per "primo problema mondiale" e buona domanda. – tripleee

risposta

7

Se il sistema lo supporta, è possibile accedere al terminale corrente direttamente con /dev/tty:

echo hello world | tee /dev/tty | awk '{print $2, $1}' 

(Il file è disponibile in Linux e Mac OS X, in ogni caso.)

Il tty comando restituisce il nome del file collegato allo standard input, che potrebbe non essere necessariamente un terminale. Nella tua pipe, è il "file" associato allo standard output del comando precedente.

+0

Testato e funziona su raspbian, netbsd, CentOS; quindi dovrebbe essere buono per la maggior parte – demure

+0

Ah.yes. Questo ha perfettamente senso. Avrei dovuto saperlo. (O // O). (secondo wikipedia questa è una faccina per imbarazzo). Grazie. – hardcode57

+0

Ha! Se avessi fatto un "ls" veloce, sarei quindi entrato: – hardcode57

1

È anche possibile utilizzare tee con Sostituzione di processo se supportata sul sistema:

echo hello world | tee >(awk '{print $2, $1}') 

La linea a volte arriva troppo tardi, quindi potrebbe essere necessario aggiungere ; sleep .01 alla fine, se necessario.

Oppure si può utilizzare l'errore standard per il reporting:

echo hello world | tee >(cat >&2) | awk '{print $2, $1}'