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एक विशेष पथ है। इसे खोलने का एक प्रभाव है, जैसा कि डुप्लिकेट एफडी 3: एफडी 4 अंक एक ही जगह के लिए एफडी 3, ट्टी।

प्रत्येक क्रमिक openat()कॉल के लिए एक ही बात होती है । जब धूल 4, 5, 6, और 7 बसती है तो सभी fd 3 के डुप्लिकेट हैं।

  • 1 → ट्टी
  • 3 → ट्टी
  • 4 → ट्टी
  • 5 → ट्टी
  • 6 → ट्टी
  • 7 → ट्टी

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