การจับภาพ STDERR และ STDOUT ไปยังไฟล์โดยใช้ที


16

ฉันไม่มีความชัดเจนว่าการสั่งซื้อที่ดีที่สุดคือการจับภาพทั้งSTDERRและไปยังแฟ้มเดียวกันโดยใช้STDOUT teeฉันรู้ว่าถ้าฉันต้องการไปป์กับไฟล์ฉันต้องแมป filehandle หลังจากเปลี่ยนเส้นทางคือ

find . >/tmp/output.txt 2>&1

นี้จะสั่งให้เปลือกที่จะส่งSTDOUTไป/tmp/output.txtแล้วจะส่งSTDERRไปSTDOUT(ซึ่งขณะนี้ส่งไปยัง/tmp/output.txt)

ความพยายามที่จะดำเนินการ2>&1ก่อนที่จะเปลี่ยนเส้นทางไฟล์จะไม่มีผลที่ต้องการ

อย่างไรก็ตามเมื่อฉันต้องการใช้ pipe teeควรเป็น:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?

คำตอบ:


19

หลัง; มันทำให้แน่ใจว่า STDOUT และ STDERR ของคำสั่งดั้งเดิมไปที่ fd เดียวกันจากนั้นดึงข้อมูลพวกมันเข้าด้วยกันเป็นที ในกรณีก่อนหน้านี้คือ STDERR ของคำสั่ง tee ที่คุณจะเข้าร่วมกับ STDOUT


5
น่าสนใจที่หน้า bash man กล่าวว่า "หาก|&ใช้แล้วข้อผิดพลาดมาตรฐานของ command1 จะเชื่อมต่อกับอินพุตมาตรฐานของ command2 ผ่านทางไพพ์ซึ่งเป็นข้อมูลย่อสำหรับการ2>&1 |เปลี่ยนทิศทางโดยปริยายของข้อผิดพลาดมาตรฐานจะดำเนินการหลังจากการเปลี่ยนทิศทางที่ระบุโดยคำสั่ง"
PP

ฉันต้องสร้างโปรแกรม C ขนาดเล็กที่เขียนทั้งไปยังstderrและstdoutเพื่อทำความเข้าใจปัญหานี้ โอเปอเรเตอร์การเปลี่ยนเส้นทาง>และ tee |แตกต่างกันเมื่อพยายามจับภาพสตรีมเอาท์พุททั้งสอง ./testapp > /tmp/out.log 2>&1สำหรับการเปลี่ยนเส้นทางที่ฉันได้ไป ./testapp 2>&1 | tee /tmp/out.logในขณะที่สำหรับทีผมต้อง
typelogic

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