ओएस एक्स की तरह, सभी प्रणालियों पर जहां वे लिनक्स को छोड़कर समर्थित हैं , उद्घाटन /dev/fd/x
एक करने के समान है dup(x)
, जिसके परिणामस्वरूप fd x फ़ाइल के समान और विशेष रूप से एक ही फ़ाइल विवरण के लिए कम या ज्यादा अंक हैं और फ़ाइल के भीतर समान ऑफसेट होगा।
लिनक्स यहां अपवाद है। लिनक्स पर, fd x पर खुलने वाली फ़ाइल के लिए /dev/fd/x
एक सिम्क्लिन है /proc/self/fd/x
और /proc/self/fd/x
एक छद्म-सिमलिंक है। लिनक्स पर जब आप एक करते हैं open("/dev/fd/x", somemode)
, तो आपको उसी फ़ाइल पर एक नया ओपन फ़ाइल विवरण मिलता है, जिस पर ओपन होता है x
। आपके द्वारा प्राप्त नया fd किसी भी तरह से fd x से संबंधित नहीं है। विशेष रूप से, ऑफसेट फ़ाइल के प्रारंभ में होगा (यदि आप इसे O_APPEND
पाठ्यक्रम के साथ खोलते हैं ) और मोड (रीड / राइट / अपेंड ...) fd x पर एक से भिन्न हो सकते हैं (आप भी प्राप्त कर सकते हैं) fd x पर जो कुछ अलग है, उसे विपरीत मोड में खोलते समय पाइप के दूसरे छोर की तरह)। (इसका मतलब यह भी है कि यह उदाहरण के लिए सॉकेट्स के लिए काम नहीं करता है जिसे आप नहीं खोल सकते हैं () )।
तो, लिनक्स पर, जब आप करते हैं
exec 5<> file
echo test >&5
फ़ाइल के अंत में fd 5 की ऑफ़सेट है। यदि तुम करो
cat <&5
बाबाजी का थुल्लु।
फिर भी जब आप करते हैं:
cat /dev/fd/5
आप देखते हैं test
क्योंकि fd 5 cat
से file
असंबंधित एक नया रीड-ओनली fd मिलता है ।
अन्य प्रणालियों पर, पर
cat /dev/fd/5
cat
एक fd हो जाता है जो fd 5 का एक डुप्लिकेट है, इसलिए अभी भी फ़ाइल के अंत में एक ऑफसेट के साथ।
कारण है कि यह साथ काम करता है less
कि किसी कारण से, है less
एक करता है lseek()
(एक है फ़ाइल की शुरुआत करने के लिए है कि एफडी पर lseek(1); lseek(0)
निर्धारित करने के लिए फ़ाइल seekable है या नहीं)।
यहाँ, आप शायद पढ़ने के लिए एक fd और लेखन के लिए एक चाहते हैं यदि आप दोनों अलग अलग offsets चाहते हैं:
exec 5< file 9>&1 > file
या आपको फ़ाइल को फिर से खोलना होगा अगर अभी भी वहाँ है, या एक के lseek()
रूप में less
करता है।
ksh93
और zsh
एक builtin के साथ ही गोले हैं 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