บางครั้งคุณต้องการเปลี่ยนเส้นทางทั้งสอง stdout และ stderr ไปยังตำแหน่งเดียวกันนี่คือเมื่อ>&
มีการใช้งาน - มันชี้ไฟล์ descriptor หนึ่งไปยังอีก
ตัวอย่างเช่นหากคุณต้องการเขียนทั้ง stdout และ stderr ไปที่ไฟล์เดียวกัน (ไม่ว่าจะเป็น/dev/null
หรือoutput.txt
) คุณสามารถเปลี่ยนเส้นทางแยกจากกันด้วย
app 1>/dev/null 2>/dev/null
หรือคุณสามารถเปลี่ยนไฟล์ descriptor หนึ่งไฟล์ไปยังไฟล์และอีก file descriptor เป็นไฟล์แรก:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
ในตัวอย่างแรก2>&1
ไฟล์ descriptor # 2 ชี้ไปยังตำแหน่งที่ # 1 ชี้ไปแล้ว ตัวอย่างที่สองประสบความสำเร็จเหมือนกันโดยเริ่มจาก stderr แทน
อีกตัวอย่างหนึ่งมีหลายกรณีที่ stdout (file descriptor # 1) ชี้ไปยังตำแหน่งที่ต้องการแล้ว แต่คุณไม่สามารถอ้างถึงได้ด้วยชื่อ (อาจเกี่ยวข้องกับไปป์ซ็อกเก็ตหรืออื่น ๆ ) สิ่งนี้มักจะเกิดขึ้นเมื่อใช้การขยายกระบวนการ ( ` `
หรือ$( )
ตัวดำเนินการ) ซึ่งปกติจะจับเฉพาะ stdout แต่คุณอาจต้องการรวม stderr ไว้ในนั้น ในกรณีนี้คุณจะใช้>&
เพื่อชี้ stderr ไปที่ stdout:
out=$(app 2>&1)
อีกตัวอย่างที่พบบ่อยคือเพจเจอร์หรือgrep
หรือยูทิลิตี้ที่คล้ายกันเนื่องจากไปป์|
ทำงานได้เฉพาะบน stdout เท่านั้นคุณจะเปลี่ยนเส้นทาง stderr ไปเป็น stdout ก่อนที่จะใช้ไปป์:
app 2>&1 | grep hello
วิธีที่จะทราบว่าของ2>&1
หรือ1>&2
ถูกต้อง? ตั้งขึ้นแล้วอธิบายไฟล์ไปทางขวาของ>&
และอธิบายไฟล์ที่คุณต้องการที่จะเปลี่ยนเส้นทางไปทางด้านซ้าย ( 2>&1
หมายถึง "point file descriptor # 2 to file descriptor # 1")
เชลล์บางตัวมีทางลัดสำหรับการเปลี่ยนเส้นทางทั่วไป นี่คือตัวอย่างจาก Bash:
1>
สามารถย่อให้เหลือเพียง >
1>foo 2>&1
ถึง>&foo
หรือ&>foo
2>&1 | program
ไปยัง |& program
app 1>/dev/null 2>&1
นั้นหมายความว่า 2> & 1 จะชี้ไปที่ไฟล์ที่ 1 กำลังเปลี่ยนเส้นทางไปแล้ว ฉันคิดว่าฉันสามารถทำได้อย่างง่ายดายapp > /dev/null &>
?