Uscita diretta su pipe e stdout


14

Mi chiedevo se esiste un modo per convogliare l'output di un comando e indirizzarlo allo stdout. Quindi, ad esempio, fortunestampa un biscotto della fortuna e lo copia anche negli Appunti:

$ fortune | tee >(?stdout?) | pbcopy 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and
the Ugly)."
(By Matt Welsh)

Non ho il mio OSX a portata di mano, che dire fortune | tee $(tty) | pbcopy?
Archemar,

Risposte:


9

Il tuo presupposto:

fortune | tee >(?stdout?) | pbcopy

non funzionerà perché l' fortuneoutput verrà scritto sullo standard out due volte, quindi raddoppierai l'output pbcopy.

In OSX (e supporto per altri sistemi /dev/std{out,err,in}), puoi verificarlo:

$ echo 1 | tee /dev/stdout | sed 's/1/2/'
2
2

output 2due volte invece di 1e 2.

È necessario utilizzare altri descrittori di file, ad esempio un errore standard tramite /dev/stderr:

$ echo 1 | tee /dev/stderr | sed 's/1/2/'
1
2

o usa ttyper ottenere lo pseudo terminale connesso:

$ echo 1 | tee "$(tty)" | sed 's/1/2/'
1
2

Con zshe l' multiosopzione impostata, non è necessario teeaffatto:

$ echo 1 >/dev/stderr | sed 's/1/2/'
1
2

tee $(tty)O, sai,tee /dev/tty
Kenster,

ottima spiegazione, risposta in alto SO tutto intorno.
Merlin,

10

teescrive sempre nel suo output standard. Se si desidera inviare i dati a un comando oltre al terminale in cui è già in esecuzione l'output standard, utilizzare semplicemente la sostituzione di processo con quel comando. (Si noti che, nonostante l'inizio >, la sostituzione del processo non reindirizza l'output standard, il teecomando lo vede come un parametro.)

fortune | tee >(pbcopy)

Questa è buona, anche una buona soluzione.
Merlin,

0

cuonglm ha detto tutto.

Prova:

fortune | tee "$(tty)" | pbcopy

ttydovrebbe risolversi in un vero pseudo terminale (come /dev/pts/99) in una sessione interattiva (cioè in un terminale), o non un tty in batch, in e daemon.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.