ส่งออกโดยตรงไปยังท่อและ stdout


14

ฉันสงสัยว่ามีวิธีที่จะส่งออกท่อของคำสั่งและตรงไปยัง stdout ตัวอย่างเช่นfortuneพิมพ์คุกกี้โชคลาภและคัดลอกไปยังคลิปบอร์ด:

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

ฉันไม่มี OSX อยู่ในมือแล้วจะเป็นfortune | tee $(tty) | pbcopyอย่างไร?
Archemar

คำตอบ:


9

สมมติฐานของคุณ:

fortune | tee >(?stdout?) | pbcopy

จะไม่ทำงานเพราะการส่งออกจะถูกเขียนไปออกมาตรฐานสองครั้งเพื่อให้คุณจะเป็นสองเท่าออกไปfortunepbcopy

ใน OSX (และการสนับสนุนระบบอื่น ๆ/dev/std{out,err,in}) คุณสามารถตรวจสอบได้:

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

การส่งออก2ครั้งที่สองแทนและ12

คุณต้องใช้ file descriptors อื่น ๆ ตัวอย่างข้อผิดพลาดมาตรฐานผ่าน/dev/stderr:

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

หรือใช้ttyเพื่อรับเทอร์มินัลหลอกที่เชื่อมต่ออยู่:

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

ด้วยzshและmultiosชุดตัวเลือกคุณไม่จำเป็นต้องทำอะไรเลยtee:

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

tee $(tty)หรือ y'knowtee /dev/tty
Kenster

คำอธิบายที่ดีสุดยอดดังนั้นจงตอบคำถามทุกข้อ
เมอร์ลิน

11

teeเขียนไปยังเอาต์พุตมาตรฐานเสมอ หากคุณต้องการส่งข้อมูลไปยังคำสั่งนอกเหนือจากเทอร์มินัลที่เอาต์พุตมาตรฐานกำลังดำเนินการอยู่ให้ใช้การทดแทนกระบวนการด้วยคำสั่งนั้น (โปรดทราบว่าแม้การเริ่มต้นด้วย>การทดแทนกระบวนการไม่เปลี่ยนเส้นทางออกมาตรฐานteeคำสั่งเห็นว่ามันเป็นพารามิเตอร์.)

fortune | tee >(pbcopy)

นี่เป็นวิธีการแก้ปัญหาที่ดีเช่นกัน
เมอร์ลิน

0

cuonglm พูดทั้งหมด

เพียงแค่พยายามที่:

fortune | tee "$(tty)" | pbcopy

ttyควรแก้ไขเป็นเทอร์มินัลเทียม (เช่น/dev/pts/99) จริงในเซสชันแบบโต้ตอบ (เช่นในเทอร์มินัล) หรือไม่มี ttyในแบทช์ที่และ daemon

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.