Output langsung ke pipa dan stdout


14

Saya bertanya-tanya apakah ada cara untuk mem-pipe output dari sebuah perintah dan mengarahkannya ke stdout. Jadi misalnya, fortunemencetak kue keberuntungan dan juga menyalinnya ke clipboard:

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

Saya tidak memiliki OSX saya, bagaimana fortune | tee $(tty) | pbcopy?
Archemar

Jawaban:


9

Asumsi Anda:

fortune | tee >(?stdout?) | pbcopy

tidak akan berfungsi karena fortuneoutput akan ditulis ke standar dua kali, jadi Anda akan menggandakan output ke pbcopy.

Di OSX (dan dukungan sistem lainnya /dev/std{out,err,in}), Anda dapat memeriksanya:

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

output 2dua kali alih-alih 1dan 2.

Anda harus menggunakan deskriptor file lain, contoh kesalahan standar melalui /dev/stderr:

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

atau gunakan ttyuntuk mendapatkan terminal semu yang terhubung:

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

Dengan zshdan multiosopsi diset, Anda tidak perlu teesama sekali:

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

tee $(tty)Atau, Anda tahu,tee /dev/tty
Kenster

penjelasan hebat, jawaban SO teratas di sekitar.
Merlin

10

teeselalu menulis ke output standarnya. Jika Anda ingin mengirim data ke perintah di samping terminal di mana output standar sudah berjalan, cukup gunakan substitusi proses dengan perintah itu. (Perhatikan bahwa meskipun dimulai dengan >, substitusi proses tidak mengarahkan output standar, teeperintah melihatnya sebagai parameter.)

fortune | tee >(pbcopy)

Ini bagus, juga solusi yang baik.
Merlin

0

cuonglm mengatakan itu semua.

Coba saja:

fortune | tee "$(tty)" | pbcopy

ttyharus menyelesaikan terminal pseudo aktual (seperti /dev/pts/99) dalam sesi interaktif (yaitu dalam terminal), atau tidak ada tty dalam batch, at dan daemon.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.