tee stdout ถึง stderr?


17

ฉันต้องการส่ง stdout จากกระบวนการหนึ่งไปยัง stdin ของกระบวนการอื่น แต่ก็รวมถึงคอนโซลด้วย ยกตัวอย่างเช่นส่ง stdout ไปที่ stdout + stderr

ตัวอย่างเช่นฉันได้git editนามแฝงต่อไปนี้:

git status --short | cut -b4- | xargs gvim --remote

xargsฉันต้องการรายการชื่อไฟล์จะถูกส่งไปยังหน้าจอเช่นเดียวกับการ

ดังนั้นมีteeยูทิลิตี้เหมือนที่จะทำเช่นนี้? เพื่อให้ฉันสามารถทำสิ่งที่ชอบ:

git status --short | \
    cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
    xargs gvim --remote

คำตอบ:


14

tee สามารถทำซ้ำกับคอนโซลปัจจุบันโดยใช้ tee /dev/tty

git status --short | cut -b4- | tee /dev/tty | xargs gvim --remote

ในทางกลับกันคุณสามารถใช้/dev/stdoutหรือ/dev/stderrไม่ก็สามารถเปลี่ยนเส้นทางได้หากคำสั่งของคุณอยู่ในสคริปต์ โปรดทราบว่า/dev/ttyจะเป็นคอนโซลเสมอ (และอาจไม่มีอยู่ในเชลล์ที่ไม่มีการโต้ตอบ) นี่เป็นสิ่งที่ผิดอ่านความคิดเห็น


1
แน่นอนในขั้นตอนที่คุณแสดง/dev/stdout ถูกเปลี่ยนเส้นทาง นั่นคือถ้าคุณใช้เอtee /dev/stdoutฟเฟกต์จะเป็นว่าทุกอย่างถูกส่งไปxargsสองครั้งและไม่มีอะไรไปที่เทอร์มินัล
celtschk

/dev/stdoutไม่ได้ถูกเปลี่ยนเส้นทางโดยไพพ์มันจะยังคงเอาต์พุตมาตรฐานกระบวนการปัจจุบัน อย่างไรก็ตามหากคุณแค็ปซูลคำสั่งในสคริปต์แล้วเปลี่ยนเส้นทาง stdout ของสคริปต์นี้ก็/dev/stdoutจะถูกเปลี่ยนเส้นทาง ในคอนโซลแบบโต้ตอบtee /dev/ttyและtee /dev/stdoutมีผลเหมือนกันแม้ว่าจะใช้ไปป์
Vincent Robert

ถ้าคุณไม่เชื่อฉันเริ่มต้นเปลือกและชนิดของคุณและecho foo | tee /dev/stdout | tr f b echo foo | tee /dev/tty | tr f bนี่คือคำแนะนำสำหรับคุณ: มันเป็นteeสิ่งที่ตีความ/dev/stdoutเป็นชื่อไฟล์
celtschk

2
คุณถูกต้องฉันไม่ทราบว่าฉันพลาด ฉันทำการทดสอบในเปลือกของตัวเองด้วย tty และ stdout และฉันก็พลาดมันไป ขอบคุณสำหรับคำชี้แจงฉันลบข้อความผิด
Vincent Robert

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


3

คุณสามารถใช้คำสั่งteeเพียงป้อนด้วยไฟล์ STDERR ตัวอย่างเช่น:

tee /dev/stderr
tee /proc/self/fd/2

ดังนั้นในกรณีนี้นามแฝงของคุณอาจจะ:

git status --short | \
    cut -b4- | tee /dev/stderr | \
    xargs gvim --remote

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