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)
pengguna14492
sumber
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
cuonglm
sumber
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)
Gilles 'SANGAT berhenti menjadi jahat'
sumber
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.

Archemar
sumber