3> & 1 หมายถึง 4> & 3 5> & 3 ฯลฯ หรือไม่


31

ฉันคาดหวัง

echo foo | tee /proc/self/fd/{3..6} 3>&1

ล้มเหลวด้วยข้อผิดพลาดเช่น/ proc / self / fd / 4: ไม่มีไฟล์หรือไดเร็กตอรี่อื่น ๆ , แต่ด้วยความประหลาดใจของฉัน, มันแสดงผลออกมา

foo
foo
foo
foo
foo

มันเป็น3>&1สาเหตุทำให้ตัวบอกรายละเอียดทั้งหมดต่อไปนี้ถูกเปลี่ยนเส้นทางไปยัง stdout ยกเว้นว่าจะไม่ทำงานหากฉันเปลี่ยน3เป็นอย่างอื่นเช่น

$ echo foo | tee /proc/self/fd/{3..6} 4>&1
tee: /proc/self/fd/3: No such file or directory
tee: /proc/self/fd/5: No such file or directory
tee: /proc/self/fd/6: No such file or directory
foo
foo
$ echo foo | tee /proc/self/fd/{4..6} 4>&1
tee: /proc/self/fd/5: No such file or directory
tee: /proc/self/fd/6: No such file or directory
foo
foo

มีคำอธิบายสำหรับพฤติกรรมนี้หรือไม่?

คำตอบ:


31

strace แสดงลำดับการเรียกของระบบนี้:

$ strace -o strace.log tee /proc/self/fd/{3..6} 3>&1
...
$ cat strace.log
...
openat(AT_FDCWD, "/proc/self/fd/3", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
openat(AT_FDCWD, "/proc/self/fd/4", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 5
openat(AT_FDCWD, "/proc/self/fd/5", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
openat(AT_FDCWD, "/proc/self/fd/6", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 7
...

บรรทัดแรกจะเปิดขึ้น/proc/self/fd/3และกำหนดหมายเลข fd ถัดไปที่มีให้ 4 /proc/self/fd/3คือเส้นทางพิเศษ เปิดมันมีผลคล้ายกับDUPไอเอ็นจี fd 3: FD 4 จุดไปยังสถานที่เดียวกับ FD 3 TTY

สิ่งเดียวกันเกิดขึ้นสำหรับการopenat()โทรติดต่อกันทุกครั้ง เมื่อฝุ่นจับคู่ fds 4, 5, 6 และ 7 ต่างกันที่ fd 3

  • 1 → tty
  • 3 → tty
  • 4 → tty
  • 5 → tty
  • 6 → tty
  • 7 → tty

โปรดทราบว่าการ3>&1เปลี่ยนเส้นทางไม่สำคัญ สิ่งที่สำคัญคือการที่เรากำลังขอให้ทีจะเปิด/proc/self/fd/Nที่ไม่มีการใช้งานแล้ว เราควรได้ผลเหมือนกันถ้าเรากำจัด3>&1และเริ่มทีออกไป/proc/self/fd/2แทน มาดูกัน:

$ echo foo | tee /proc/self/fd/{2..6}
foo
foo
foo
foo
foo
foo

ได้รับการยืนยัน! ผลลัพธ์เดียวกัน

นอกจากนี้เรายังสามารถทำซ้ำหมายเลข fd ซ้ำไปซ้ำมา เราได้ผลลัพธ์เดียวกันเมื่อเรากด fd 6 เมื่อถึงเวลาสุดท้ายมันได้เปิดตัวอธิบายเพียงพอที่จะกระโดดได้ถึง 6 เท่า

$ echo foo | tee /proc/self/fd/{2,2,2,2,6}
foo
foo
foo
foo
foo
foo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.