บางครั้งคุณต้องการเปลี่ยนเส้นทางทั้งสอง 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 &>?