บน OS X เช่นเดียวกับทุกระบบที่รองรับยกเว้น Linux การเปิด/dev/fd/x
จะเหมือนกับการทำจุดdup(x)
fd ที่มากขึ้นหรือน้อยลงไปเป็นคำอธิบายไฟล์แบบเปิดเดียวกันกับบน fd x และโดยเฉพาะอย่างยิ่งจะมีออฟเซ็ตเดียวกันภายในไฟล์
Linux เป็นข้อยกเว้นที่นี่ บน Linux /dev/fd/x
เป็น symlink /proc/self/fd/x
และ/proc/self/fd/x
เป็น pseudo-symlink ไปยังไฟล์ที่เปิดอยู่บน fd x บน Linux เมื่อคุณทำopen("/dev/fd/x", somemode)
คุณจะได้รับแบรนด์ใหม่รายละเอียดการเปิดไฟล์x
ไปยังแฟ้มเดียวกับที่เปิดใน fd ใหม่ที่คุณได้รับนั้นไม่เกี่ยวข้องกับ fd x แต่อย่างใด โดยเฉพาะอย่างยิ่งการชดเชยจะอยู่ที่จุดเริ่มต้นของไฟล์ (ยกเว้นถ้าคุณเปิดด้วยO_APPEND
แน่นอน) และโหมด (อ่าน / เขียน / ผนวก ... ) อาจแตกต่างจากหนึ่งใน fd x (คุณสามารถรับได้ สิ่งที่แตกต่างจากสิ่งที่อยู่ใน fd x เช่นปลายท่อเมื่อเปิดในโหมดตรงกันข้าม) (นั่นหมายความว่าจะไม่ทำงานกับซ็อกเก็ตเช่นที่คุณไม่สามารถเปิดได้) ( )
ดังนั้นบน Linux เมื่อคุณทำ
exec 5<> file
echo test >&5
อ็อฟเซ็ต fd 5 อยู่ที่ท้ายไฟล์ ถ้าคุณทำ
cat <&5
คุณไม่ได้รับอะไรเลย
ยังเมื่อคุณ:
cat /dev/fd/5
คุณเห็นtest
เพราะcat
ได้รับ fd แบบอ่านอย่างเดียวเป็นfile
ไม่เกี่ยวข้องกับ fd 5
ในระบบอื่น ๆ
cat /dev/fd/5
cat
รับ fd ที่ซ้ำกับ fd 5 ดังนั้นยังคงมี offset ตรงท้ายไฟล์
เหตุผลที่ใช้งานได้less
คือด้วยเหตุผลบางประการให้less
ทำlseek()
f บนนั้นไปยังจุดเริ่มต้นของไฟล์ (ทำlseek(1); lseek(0)
เพื่อพิจารณาว่าไฟล์นั้นหาได้หรือไม่)
ที่นี่คุณอาจต้องการ fd สำหรับการอ่านและอีกอันสำหรับการเขียนหากคุณต้องการให้ offsets ต่างกัน:
exec 5< file 9>&1 > file
หรือคุณจะต้องเปิดไฟล์อีกครั้งหากยังอยู่ที่นั่นหรือทำlseek()
เช่นless
นั้น
ksh93
และzsh
เป็นหอยเดียวที่มีlseek()
โอเปอเรเตอร์ในตัวแม้ว่า:
cat <&5 <#((0)) # ksh93
{sysseek 0; cat} <&5 # zsh, zmodload zsh/system to enable that builtin
หรือ:
cat /dev/fd/5 5<#((0)) # ksh93
sysseek -u 5 0; cat /dev/fd/5 # zsh