ऐसा क्यों है कि ये दो 'बिल्ली' कमांड अलग-अलग परिणाम देते हैं?


12

मान लेते हैं कि शिशु में एक विशिष्ट पाठ होता है, और मैं निम्नलिखित आदेशों को निष्पादित करने के लिए था:

कार्यकारी 3<infile

बिल्ली-एन <&3

बिल्ली-एन <&3

बिल्ली का पहला उदाहरण फ़ाइल की सामग्री को प्रदर्शित करेगा, लेकिन दूसरी बार कुछ भी नहीं लगता है। वे अलग क्यों हैं?

जवाबों:


29

वे एक ही कमांड की तरह दिखते हैं, लेकिन उनके कारण अलग-अलग हैं क्योंकि सिस्टम कमांड पहले कमांड के परिणामस्वरूप बदल गया है। विशेष रूप से, पहली catपूरी फ़ाइल का उपभोग करता है, इसलिए दूसरे के catपास पढ़ने के लिए कुछ भी नहीं बचा है, तुरंत ईओएफ (फ़ाइल का अंत) को हिट करता है और बाहर निकलता है।

इसके पीछे का कारण आप दोनों के इनवोकेशन के लिए सटीक एक ही फ़ाइल विवरण (आपके द्वारा बनाई गई exec < infileऔर फ़ाइल डिस्क्रिप्टर को असाइन की गई 3) का उपयोग कर रहे हैं cat। एक खुले फ़ाइल विवरण के साथ जुड़ी चीजों में से एक फ़ाइल ऑफसेट है। तो, पहले catपूरी फाइल को पढ़ता है, अंत में ऑफसेट छोड़ता है, और दूसरा फ़ाइल के अंत से लेने की कोशिश करता है और पढ़ने के लिए कुछ भी नहीं पाता है।


12

बस @ jw013 के ठीक जवाब में जोड़ने के लिए, यह महसूस करने में मदद मिल सकती है कि यह उसी तरह है

{
   cat -n
   cat -n
} < infile

< fileछोटा होने के कारण 0< file, यह 3 के बजाय फ़ाइल डिस्क्रिप्टर 0 का उपयोग करता है।

और बस मामले को थोड़ा भ्रमित करने के लिए, यह संस्करण:

exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3

बर्ताव करता है अलग ढंग से ओएस आप में इसे चलाने और पर निर्भर करता है प्रकार की infile(पाइप डिवाइस बनाम बनाम नियमित रूप से फ़ाइल ...)

सोलारिस और अधिकांश वाणिज्यिक यूनियनों पर, open("/dev/fd/3")एक dup(3)( कम से कम एक समान है ( < /dev/fd/3जैसा कि लगभग उसी के समान है <&3), जबकि लिनक्स पर, नियमित फ़ाइलों के /dev/fd/3लिए, मूल फ़ाइल के लिए सिमलिंक के रूप में कार्यान्वित किया जाता है, इसलिए open("/dev/fd/3")इसे प्रारंभ से नए सिरे से खोलता है ( और संभवतः fd 3 से अलग झंडे के साथ)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.