एक कमांड को दो पाइप


9

मैं निम्नलिखित वाक्यविन्यास से थोड़ा भ्रमित हूं। हालांकि यह काम करता है, यह समझ में नहीं आता कि यह क्यों काम करता है। ऐसा लगता है, जैसे कि अलग कमांड में दो पाइप जुड़े हुए हैं। लेकिन वहाँ केवल एक ही नहीं है STDIN?

उदाहरण:

diff <(echo "foobar") <(echo "barbaz")
diff <(cat foo.txt) <(cat bar.txt)

यहाँ प्रासंगिक topic-- का लिंक है प्रक्रिया प्रतिस्थापन --in bashआदमी पेज।
शेपनर

जवाबों:


13

पाइप केवल 0 (स्टडिन) की तुलना में अलग-अलग फ़ाइल डिस्क्रिप्टर के लिए बाध्य हैं:

$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62

एक प्रक्रिया में एक समय में एक से अधिक ओपन फाइल डिस्क्रिप्टर हो सकते हैं, इसलिए कोई समस्या नहीं है।


अगर मुझे केवल इसके अस्थायी पाइपों का पता होता, तो मैं इसे गूगल कर पाता। धन्यवाद!

@ भाई: मुझे नहीं लगता कि इसे "अस्थायी पाइप" कहा जाता है। यह सिर्फ पाइप है, जैसा कि pipe()सिस्टम कॉल द्वारा बनाया गया है ।
स्वेन मार्नाच

बहुत सटीक होने के लिए, इसे "गुमनाम नामित पाइप" कहा जा सकता है, लेकिन यह इसे Google के लिए पर्याप्त है।

2
@WilliamPursell: इसमें कोई फ़ाइल शामिल नहीं है। शेल एक अनाम पाइप का उपयोग करके बनाता है pipe()और फिर उपप्रोसेस को कांटा करता है। यदि अनाम पाइप का उपयोग किया जाता है तो मुख्य प्रक्रिया में अतिरिक्त फ़ाइल डिस्क्रिप्टर खुले हैं। ये अतिरिक्त फ़ाइल डिस्क्रिप्टर फ़ॉर्म में पास हो गए हैं /dev/fd/..., और प्रक्रिया आमतौर पर इन फ़ाइल नामों का उपयोग करके उन्हें खोल देगी। यह उन्हें dup()एड होने देगा , और भी अधिक ओपन फाइल डिस्क्रिप्टर का निर्माण करेगा। प्रक्रिया बिना किसी खुले कॉल के भी तुरंत नामांकित फ़ाइल डिस्क्रिप्टर का उपयोग कर सकती है ...
स्वेन मार्नाच

1
... जैसा कि इस छोटे और बेवकूफ परीक्षण कार्यक्रम में दिखाया गया है । संकलन करने के बाद a, मैंने इसे कॉल किया ./a <(ls), और इसने फ़ाइलों की सूची को सफलतापूर्वक छाप दिया, यह साबित करते हुए नामांकित फ़ाइल डिक्रिप्टर (मेरे मामले में 63) पहले से ही खुला था। बैश लिनक्स की तुलना में विभिन्न आर्किटेक्चर पर एक अस्थायी निर्देशिका में नामित पाइप का उपयोग कर सकता है, इस मामले में मुख्य प्रक्रिया में प्रवेश करते समय कोई अतिरिक्त फ़ाइल विवरण नहीं खुला होगा।
स्वेन मार्नाच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.