एकाधिक मानक इनपुट? कैसे?


36

इस कमांडलाइनफू पोस्ट से :

$ diff <(wget -q -O - URL1) <(wget -q -O - URL2)

कई मानक इनपुट की तरह लगता है, लेकिन --- अगर मैं अपने लिनक्स पोरग्रामिंग पाठ्यक्रम को सही ढंग से याद रखता हूं तो --- यह नहीं हो सकता। मैंने सोचा था कि, परिभाषा के अनुसार, मानक इनपुट एक धारा थी।

शायद यह स्टिच के साथ क्या करना है? क्या कोई मुझे ये समझा सकता है; शायद प्रलेखन के लिए लिंक प्रदान करते हैं।

बोनस: एक स्क्रिप्ट इन कई धाराओं को कैसे हैंडल करेगी? अगर कोई पायथन या पर्ल उदाहरण दे सकता है, तो यह बहुत मददगार होगा।


1
अच्छा प्रश्न। यदि आप अनजान हैं, तो एक यूनिक्स / लिनक्स क्यू एंड ए साइट है: unix.stackexchange.com
मैट एलेन

2
प्रक्रिया प्रतिस्थापन के लिए दस्तावेज़ीकरण: gnu.org/software/bash/manual/bashref.html#Process-Substitution
glenn jackman

नोट: बैश में है <(…); Zsh प्रक्रिया में प्रतिस्थापन सिंटैक्स है =(…)
कामिल मैकियोरोस्की

जवाबों:


27

यह एकाधिक मानक इनपुट नहीं है। यह एक बशीवाद है जिसे 'प्रोसेस सब्स्टीट्यूशन' कहा जाता है http://tldp.org/LDP/abs/html/process.sn.html

यह /dev/fd/somethingप्रत्येक प्रतिस्थापन के लिए एक छद्म फ़ाइल ( ) बनाता है । यह बहुत उपयोगी है। कमांड केवल एक स्ट्रीम के रूप में पढ़ सकता है, जिसका अर्थ है कि यह fseek के साथ आगे और पीछे नहीं जा सकता है। इसे पाइप की तरह बाइट्स की धारा के रूप में पढ़ने की जरूरत है।

बोनस उत्तर

इसका उपयोग करने के लिए आपको बहुत अधिक करने की आवश्यकता नहीं है। जहां तक ​​आपकी स्क्रिप्ट की बात है, तो इसे कमांड लाइन पर एक वैध फ़ाइल नाम मिलता है, जो किसी भी अन्य चीज़ की तरह ओपन () एड हो सकता है। जैसा कि अन्य लोगों ने कहा है, आप देखेंगे diff /dev/fd/XX /dev/fd/YY। यदि आप इनमें से किसी भी छद्म फाइलों पर एक स्टेटमेंट () करते हैं, तो आप देखेंगे कि यह एक नामित पाइप है, और आपको इसे पाइप शब्दार्थों के साथ व्यवहार करना चाहिए - अर्थात् कोई fseek () या फुटेल () नहीं। यदि आप एक स्टेटमेंट () टेस्ट करते हैं, तो स्पष्ट रूप से देखें कि क्या यह एक फाइल है (उदाहरण के लिए [ -f $1 ]) यह टूट जाएगा - यह एक नामित पाइप के रूप में लागू किया जाता है।


बैश प्रक्रिया प्रतिस्थापन के लिए एक और अच्छा संदर्भ - wiki.bash-hackers.org/syntax/expansion/proc_subst
studgeek

और इस सुविधा का अनुशंसित उपयोग क्या है? इसका समर्थन करें जब भी आपका प्रोग्राम यादृच्छिक अभिगम वाली फ़ाइल की आवश्यकता के बजाय एक धारा के साथ काम कर सकता है?
मास्टरएक्सिलो

7

<(...)बाश में प्रक्रिया प्रतिस्थापन करता है । Parens में प्रक्रिया का आउटपुट सामान्य 3 से परे एक अतिरिक्त फ़ाइल डिस्क्रिप्टर को भेजा जाता है, और उस फ़ाइल डिस्क्रिप्टर के अनुरूप फ़ाइल नाम दिया जाता है। इस तरह एक कमांड के आउटपुट को किसी अन्य कमांड को पास करने के लिए फाइलनाम के रूप में माना जा सकता है।


7

प्रत्येक प्रक्रिया के लिए एक stdinऔर एक stdout है । वे आम तौर पर टर्मिनल से जुड़े होते हैं, लेकिन उन्हें एक-दूसरे से अलग-अलग पुनर्निर्देशित किया जा सकता है।

उदाहरण में, वहाँ दो हैं wget, जिनमें से प्रत्येक का अपना हो जाता है शामिल प्रक्रियाओं, stdinऔर stdout। प्रत्येक wgetप्रक्रिया लिखती है -, जो कि इसकी है stdout। तब bashप्रक्रिया प्रतिस्थापन एक अद्वितीय छद्म फ़ाइल की प्रक्रिया को <(...)जोड़ता है stdout, जिसमें से diffपढ़ सकते हैं। ध्यान दें कि दो प्रक्रिया प्रतिस्थापन दो अलग-अलग छद्म फाइलों की उपज देते हैं! इस प्रकार, diffकुछ इस तरह देखता है:

diff /dev/fd/XX /dev/fd/YY

जहां stdoutके wget -q -O - URL1लिए जुड़ा हुआ है /dev/fd/XX, और stdoutके wget -q -O - URL2लिए /dev/fd/YY

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