มีวิธีการเปลี่ยนเส้นทางการส่งออกของโปรแกรมและยังคงไป stdout หรือไม่


24

ถูก ถ้าฉันต้องการเปลี่ยนเส้นทางผลลัพธ์ของโปรแกรมไปยังไฟล์ฉันจะทำสิ่งนี้

prog > file

หากฉันต้องการเปลี่ยนเส้นทางทั้ง stdout และ stderr ไปที่ไฟล์นั้นฉันก็จะทำ

prog > file 2>&1

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


คำศัพท์: คุณหมายถึงและยังคงไปยังสถานี stdoutคือ file-descriptor 1 และfoo > some_fileหมายความว่า file-only descriptor ที่เปิดอยู่some_fileนั้นเป็น stdout ของ foo stdout ไปที่ stdout เสมอ
Peter Cordes

คำตอบ:


39

teeมีอยู่เพื่อจุดประสงค์นี้ มันใช้อาร์กิวเมนต์ชื่อไฟล์และเขียนข้อมูลที่อ่านจาก stdin ไปยัง stdout และไฟล์:

$ prog 2>&1 | tee file

10
และเพื่อเพิ่มความน่ารักของทุบตี 4 prog |& tee file.
Tobu

1
นอกจากนี้คุณยังสามารถแทนที่ 'ไฟล์' ด้วย
Kevin Cantu

@KevinCantu: ไพพ์ที่มีชื่อเป็นไฟล์ประเภทเดียว นี่คือ Unix ที่ทุกอย่างเป็นไฟล์ นอกจากนี้คุณยังprog |& tee /dev/tty > fileสามารถใช้ประโยชน์ซึ่งอยู่ตรงกลางของไพพ์ไลน์เช่นfoo |& tee /dev/tty | sed 's/.*\r//' > foo.logเพื่อดูการอัพเดตความคืบหน้าของสถานะบรรทัดบนเทอร์มินัลของคุณ แต่กรองออกจากไฟล์บันทึก หรือใช้เพื่อดีบักไปป์ไลน์ที่คุณแฮ็กด้วยกันโดยให้คุณเห็นข้อมูล ณ จุดนั้น
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.