पाइपलाइन (यूनिक्स): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(12 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{About|गोले के लिए मूल कार्यान्वयन|सामान्यतः सॉफ्टवेयर पाइपलाइन|पाइपलाइन (सॉफ्टवेयर)}}
{{About|गोले के लिए मूल कार्यान्वयन|सामान्यतः सॉफ्टवेयर पाइपलाइन|पाइपलाइन (सॉफ्टवेयर)}}
[[File:Pipeline.svg|thumb|280px|टेक्स्ट टर्मिनल पर चलने वाली तीन प्रोग्राम प्रक्रियाओं की एक पाइपलाइन]][[यूनिक्स]] जैसे कंप्यूटर [[ऑपरेटिंग सिस्टम]] में, एक पाइपलाइन संदेश पासिंग का उपयोग करके अंतर-प्रक्रिया संचार के लिए एक तंत्र है। एक पाइपलाइन [[प्रक्रिया (कंप्यूटिंग)]] का एक सेट है जो उनके मानक धाराओं द्वारा एक साथ जंजीर है, ताकि प्रत्येक प्रक्रिया का आउटपुट पाठ (''[[stdout]]'') सीधे इनपुट (''[[stdin]]'') के रूप में अगले एक में पारित हो जाए। दूसरी प्रक्रिया शुरू की जाती है क्योंकि पहली प्रक्रिया अभी भी निष्पादित हो रही है, और उन्हें संगामिति (कंप्यूटर विज्ञान) निष्पादित किया जाता है।
[[File:Pipeline.svg|thumb|280px|टेक्स्ट टर्मिनल पर गति करने वाली तीन प्रोग्राम प्रक्रियाओं की पाइपलाइन]][[यूनिक्स]] जैसे कंप्यूटर [[ऑपरेटिंग सिस्टम|परिचालन प्रणाली]] में, पाइपलाइन संदेश मार्ग का उपयोग करके अंतर-प्रक्रिया संचार के लिए तंत्र होता है। पाइपलाइन उनकी मानक धाराओं द्वारा श्रृंखलाबद्ध [[प्रक्रिया (कंप्यूटिंग)]] का समूह है, जिससे प्रत्येक प्रक्रिया का आउटपुट पाठ (''[[stdout|स्टडआउट]]'') सीधे इनपुट (''[[stdin|स्टडिन]]'') के रूप में आगामी में पारित हो जाए। द्वितीय प्रक्रिया प्रारम्भ की जाती है क्योंकि प्रथम प्रक्रिया अभी भी निष्पादित हो रही है, और और उन्हें समवर्ती रूप से निष्पादित किया जाता हैI
यूनिक्स के विकास के दौरान, यूनिक्स के विकास के दौरान [[बेल लैब्स]] के यूनिक्स के पैतृक घर में [[डगलस मैक्लॉयय]] द्वारा पाइपलाइनों की अवधारणा का समर्थन किया गया था, जिसने इसके [[यूनिक्स दर्शन]] को आकार दिया।<ref>{{cite web |first=Michael S. |last=Mahoney |url=http://www.princeton.edu/~hos/Mahoney/expotape.htm |title=The Unix Oral History Project: Release.0, The Beginning |quote=McIlroy: It was one of the only places where I very nearly exerted managerial control over Unix, was pushing for those things, yes.}}</ref><ref>{{cite web |url=http://cm.bell-labs.com/cm/cs/who/dmr/mdmpipe.html |title=भविष्यवाणी पेट्रोग्लिफ्स|website=cm.bell-labs.com |access-date=22 May 2022 |archive-url=https://web.archive.org/web/19990508221104/http://cm.bell-labs.com/cm/cs/who/dmr/mdmpipe.html |archive-date=8 May 1999 |url-status=dead}}</ref> इसे भौतिक [[पाइपलाइन परिवहन]] के सादृश्य द्वारा नामित किया गया है। इन पाइपलाइनों की एक प्रमुख विशेषता उनके आंतरिक (रिची एंड थॉम्पसन, 1974) को छिपाना है। यह बदले में प्रणाली में अधिक स्पष्टता और सरलता की अनुमति देता है।
पाइपलाइनों की अवधारणा को यूनिक्स के विकास के समय, इसके उपकरण बॉक्स दर्शन को आकार देते हुए, यूनिक्स के पैतृक होम [[बेल लैब्स]] में [[डगलस मैक्लॉयय]] द्वारा समर्थित किया गया था, जिसने इसके [[यूनिक्स दर्शन]] को आकार दिया था।<ref>{{cite web |first=Michael S. |last=Mahoney |url=http://www.princeton.edu/~hos/Mahoney/expotape.htm |title=The Unix Oral History Project: Release.0, The Beginning |quote=McIlroy: It was one of the only places where I very nearly exerted managerial control over Unix, was pushing for those things, yes.}}</ref><ref>{{cite web |url=http://cm.bell-labs.com/cm/cs/who/dmr/mdmpipe.html |title=भविष्यवाणी पेट्रोग्लिफ्स|website=cm.bell-labs.com |access-date=22 May 2022 |archive-url=https://web.archive.org/web/19990508221104/http://cm.bell-labs.com/cm/cs/who/dmr/mdmpipe.html |archive-date=8 May 1999 |url-status=dead}}</ref> इसे भौतिक [[पाइपलाइन परिवहन]] के सादृश्य द्वारा नामित किया गया है। इन पाइपलाइनों की प्रमुख विशेषता उनके आंतरिक (रिची एंड थॉम्पसन, 1974) भागों को गुप्त रखना है। यह परिणाम स्वरुप प्रणाली में अधिक स्पष्टता और सरलता की अनुमति देता है।


यह लेख [[अनाम पाइप]]ों के बारे में है, जहां एक प्रक्रिया द्वारा लिखे गए डेटा को ऑपरेटिंग सिस्टम द्वारा तब तक बफर किया जाता है जब तक कि इसे अगली प्रक्रिया द्वारा पढ़ा नहीं जाता है, और यह यूनिडायरेक्शनल चैनल गायब हो जाता है जब प्रक्रिया पूरी हो जाती है। यह [[नामित पाइप]]ों से भिन्न होता है, जहां संदेशों को पाइप से या उस पाइप से पास किया जाता है जिसे इसे फ़ाइल बनाकर नामित किया जाता है, और प्रक्रियाएं पूरी होने के बाद बनी रहती हैं। अज्ञात पाइपों के लिए मानक [[शैल (कंप्यूटिंग)]] सिंटैक्स कई आदेशों को सूचीबद्ध करना है, जो लंबवत सलाखों (सामान्य यूनिक्स वर्बेज में पाइप) से अलग होते हैं:
यह लेख [[अनाम पाइप|अज्ञात पाइपों]] के सम्बन्ध में है, जहां प्रक्रिया द्वारा लिखे गए डेटा को परिचालन प्रणाली द्वारा तब तक बफर किया जाता है जब तक कि इसे आगामी प्रक्रिया द्वारा पढ़ा नहीं जाता है, और प्रक्रियाएं पूर्ण होने पर यह यूनिडायरेक्शनल चैनल विलुप्त हो जाता है। यह [[नामित पाइप|नामित पाइपों]] से भिन्न होता है, जहां संदेशों को पाइप से या उससे निकट किया जाता है, जिसे फ़ाइल बनाकर नामित किया जाता है, और प्रक्रियाएं पूर्ण होने के पश्चात् भी बनी रहती हैं। अज्ञात पाइपों के लिए मानक [[शैल (कंप्यूटिंग)]] सिंटैक्स कई कमांडों को सूचीबद्ध करना है, जो ऊर्ध्वाधर पट्टियों (सामान्य यूनिक्स शब्दाडंबर में "पाइप") से भिन्न होते हैं:  


<syntaxhighlight lang="bash">command1 | command2 | command3</syntaxhighlight>
<syntaxhighlight lang="bash">command1 | command2 | command3</syntaxhighlight>
उदाहरण के लिए, वर्तमान निर्देशिका में फ़ाइलों को सूचीबद्ध करने के लिए ({{mono|[[ls]]}}), केवल की पंक्तियों को बनाए रखें {{mono|ls}} स्ट्रिंग युक्त आउटपुट {{mono|"key"}} ({{mono|[[grep]]}}), और स्क्रॉलिंग पृष्ठ में परिणाम देखें ({{mono|[[Less (Unix)|less]]}}), उपयोगकर्ता टर्मिनल की कमांड लाइन में निम्नलिखित टाइप करता है:
उदाहरण के लिए, वर्तमान निर्देशिका ({{mono|[[ls]]}}), में फ़ाइलों को सूचीबद्ध करने के लिए, स्ट्रिंग {{mono|"key"}} ({{mono|[[grep]]}}) वाले {{mono|ls}} आउटपुट की केवल पंक्तियों को बनाए रखें, और परिणाम को स्क्रॉलिंग पेज ({{mono|[[Less (Unix)|less]]}}) में देखें, उपयोगकर्ता अंतिम स्टेशन की कमांड लाइन में निम्नलिखित टाइप करता है:  


<syntaxhighlight lang="bash">ls -l | grep key | less</syntaxhighlight>
<syntaxhighlight lang="bash">ls -l | grep key | less</syntaxhighlight>
आदेश <code>ls -l</code> एक प्रक्रिया के रूप में निष्पादित किया जाता है, जिसके आउटपुट (stdout) को प्रक्रिया के इनपुट (stdin) पर पाइप किया जाता है <code>grep key</code>; और इसी तरह के लिए प्रक्रिया के लिए <code>less</code>. प्रत्येक प्रक्रिया (कंप्यूटिंग) पिछली प्रक्रिया से इनपुट लेती है और मानक स्ट्रीम के माध्यम से अगली प्रक्रिया के लिए आउटपुट उत्पन्न करती है। प्रत्येक <code>|</code> शेल को बायीं ओर कमांड के मानक आउटपुट को दाहिनी ओर कमांड के मानक इनपुट से कनेक्ट करने के लिए कहता है, जिसे ऑपरेटिंग सिस्टम में कार्यान्वित एक अनाम पाइप | (अनाम) पाइप कहा जाता है। पाइप्स यूनिडायरेक्शनल हैं; डेटा पाइपलाइन के माध्यम से बाएं से दाएं बहता है।
कमांड <code>ls -l</code> को प्रक्रिया के रूप में निष्पादित किया जाता है, जिसके आउटपुट (स्टडआउट) <code>grep key</code>को प्रक्रिया के इनपुट (स्टडिन) पर पाइप किया जाता है ; और इसी प्रकार प्रक्रिया के लिए <code>less</code>प्रक्रिया (कंप्यूटिंग) पूर्व प्रक्रिया से इनपुट प्राप्त करती है, और मानक स्ट्रीम के माध्यम से आगामी प्रक्रिया के लिए आउटपुट उत्पन्न करती है। प्रत्येक <code>|</code> शेल को बायीं ओर कमांड के मानक आउटपुट को दाहिनी ओर कमांड के मानक इनपुट से कनेक्ट करने के लिए कमांड प्रदान करता है, जिसे परिचालन प्रणाली में कार्यान्वित अज्ञात पाइप कहा जाता है। पाइप्स यूनिडायरेक्शनल हैं; डेटा पाइपलाइन के माध्यम से बाएं से दाएं जाता है।


== उदाहरण ==
== उदाहरण ==
नीचे एक पाइपलाइन का उदाहरण दिया गया है जो [[यूनिफ़ॉर्म रिसोर्स लोकेटर]] द्वारा दर्शाए गए [[वर्ल्ड वाइड वेब]] संसाधन के लिए एक प्रकार का [[ बानान चेकर ]] लागू करता है। यह क्या करता है इसका स्पष्टीकरण इस प्रकार है।
नीचे पाइपलाइन का उदाहरण दिया गया है जो [[यूनिफ़ॉर्म रिसोर्स लोकेटर]] [[वर्ल्ड वाइड वेब]] संसाधन के लिए वर्तनी [[ बानान चेकर |बानान चेकर]] प्रारम्भ करता है। यह क्या करता है इसका स्पष्टीकरण इस प्रकार है।  


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Line 23: Line 23:
less
less
</syntaxhighlight>
</syntaxhighlight>
#<code>[[CURL|curl]]</code>एक वेब पेज की [[HTML]] सामग्री प्राप्त करता है (उपयोग कर सकता है <code>[[wget]]</code> कुछ प्रणालियों पर)।
#<code>[[CURL|curl]]</code>वेब पेज की [[HTML]] सामग्री प्राप्त करता है (उपयोग कर सकता है <code>[[wget]]</code> कुछ प्रणालियों पर)।
#<code>[[sed]]</code>सभी वर्णों (वेब ​​पृष्ठ की सामग्री से) को रिक्त स्थान से बदल देता है जो रिक्त स्थान या अक्षर नहीं हैं। ([[ नई पंक्ति ]]्स संरक्षित हैं।)
#<code>[[sed]]</code>सभी वर्णों (वेब ​​पृष्ठ की सामग्री से) को रिक्त स्थान से परिवर्तित कर देता है जो रिक्त स्थान या अक्षर नहीं हैं। ([[ नई पंक्ति ]]संरक्षित हैं।)
#<code>[[tr (program)|tr]]</code>सभी अपरकेस अक्षरों को लोअरकेस में बदल देता है और रिक्त स्थान को टेक्स्ट की पंक्तियों में न्यूलाइन्स में बदल देता है (प्रत्येक 'शब्द' अब एक अलग लाइन पर है)।
#<code>[[tr (program)|tr]]</code>सभी अपरकेस अक्षरों को लोअरकेस में परिवर्तित कर देता है, और रिक्त स्थान को टेक्स्ट की पंक्तियों में न्यूलाइन्स में परिवर्तित कर देता है (प्रत्येक 'शब्द' अब भिन्न लाइन पर है)।
#<code>[[grep]]</code>केवल उन पंक्तियों को शामिल करता है जिनमें कम से कम एक लोअरकेस वर्णानुक्रमिक वर्ण होता है (किसी भी रिक्त रेखा को हटाते हुए)।
#<code>[[grep]]</code>केवल उन पंक्तियों को सम्मिलित करता है जिनमें कम से कम लोअरकेस वर्णानुक्रमिक वर्ण होता है (किसी भी रिक्त रेखा को त्यागते हुए)।
#<code>[[Sort (Unix)|sort]]</code>'शब्दों' की सूची को वर्णानुक्रम में क्रमबद्ध करता है, और <code>-u</code> स्विच डुप्लीकेट हटाता है।
#<code>[[Sort (Unix)|sort]]</code>'शब्दों' की सूची को वर्णानुक्रम में क्रमबद्ध करता है, और <code>-u</code> स्विच प्रतिरूप त्यागता है।
#<code>[[comm (Unix)|comm]]</code>दो फाइलों के बीच आम लाइनों को ढूँढता है, <code>-23</code> दूसरी फ़ाइल के लिए अद्वितीय पंक्तियों को दबा देता है, और जो दोनों के लिए सामान्य हैं, केवल उन लोगों को छोड़कर जो केवल पहली फ़ाइल में पाए जाते हैं। <code>-</code> e> फ़ाइल नाम के स्थान पर कारण बनता है <code>comm</code> इसके मानक इनपुट (इस मामले में पाइप लाइन से) का उपयोग करने के लिए। <code>sort /usr/share/dict/words</code> की सामग्री को क्रमबद्ध करता है <code>words</code> फ़ाइल वर्णानुक्रम में, as <code>comm</code> अपेक्षा करता है, और <code>&lt;( ... )</code> परिणामों को एक अस्थायी फ़ाइल ([[प्रक्रिया प्रतिस्थापन]] के माध्यम से) में आउटपुट करता है, जो <code>comm</code> पढ़ता है। परिणाम उन शब्दों (पंक्तियों) की एक सूची है जो /usr/share/dict/words में नहीं पाए जाते हैं।
#<code>[[comm (Unix)|comm]]</code>दो फाइलों के मध्य सामान्य लाइनों को परिक्षण करता है, <code>-23</code> दूसरी फ़ाइल के लिए अद्वितीय पंक्तियों को दबा देता है, और जो दोनों के लिए सामान्य हैं, केवल उन कमांड को त्यागकर जो केवल प्रथम फ़ाइल में पाए जाते हैं। <code>-</code> e> फ़ाइल नाम के स्थान पर कारण बनता है, <code>comm</code> इसके मानक इनपुट (इस विषय में पाइप लाइन से) का उपयोग करने के लिए। <code>sort /usr/share/dict/words</code> की सामग्री को क्रमबद्ध करता है <code>words</code> फ़ाइल वर्णानुक्रम में, as <code>comm</code> अपेक्षा करता है, और <code>&lt;( ... )</code> परिणामों को अस्थायी फ़ाइल ([[प्रक्रिया प्रतिस्थापन]] के माध्यम से) में आउटपुट करता है, जो <code>comm</code> पढ़ता है। परिणाम उन शब्दों (पंक्तियों) की सूची है जो /usr/share/dict/words में नहीं पाए जाते हैं।
#<code>[[less (Unix)|less]]</code>उपयोगकर्ता को परिणामों के माध्यम से पेज करने की अनुमति देता है।
#<code>[[less (Unix)|less]]</code>उपयोगकर्ता को परिणामों के माध्यम से पेज करने की अनुमति देता है।


== कमांड लाइन इंटरफेस == में पाइपलाइन
== कमांड लाइन इंटरफेस में पाइपलाइन ==
{{anchor|pipe character}}
सभी व्यापक रूप से उपयोग किए जाने वाले यूनिक्स शेल में पाइपलाइनों के निर्माण के लिए विशेष सिंटैक्स निर्माण होता है। सभी उपयोगों में व्यक्ति [[ASCII]] [[ ऊर्ध्वाधर बार |ऊर्ध्वाधर बार <code>|</code>]]कैरेक्टर द्वारा पृथक किए गए क्रम में कमांड लिखता है (जिसे, इस कारण से, प्रायः "पाइप पात्र" कहा जाता है)। शेल प्रक्रियाएं शुरू करता है और उनकी मानक धाराओं (कुछ मात्रा में [[बफर (कंप्यूटर विज्ञान)]] सहित) के मध्य आवश्यक सम्बन्ध की व्यवस्था करता है।  
सभी व्यापक रूप से उपयोग किए जाने वाले यूनिक्स शेल में पाइपलाइनों के निर्माण के लिए एक विशेष सिंटैक्स निर्माण होता है। सभी उपयोगों में एक व्यक्ति क्रम में कमांड लिखता है, जिसे [[ASCII]] [[ ऊर्ध्वाधर बार ]] कैरेक्टर द्वारा अलग किया जाता है <code>|</code> (जो, इस कारण से, अक्सर पाइप वर्ण कहा जाता है)। शेल प्रक्रियाओं को शुरू करता है और उनके मानक धाराओं (कुछ मात्रा में [[बफर (कंप्यूटर विज्ञान)]] भंडारण सहित) के बीच आवश्यक कनेक्शन की व्यवस्था करता है। <!-- Shouldn't this be in the shell article? As with all shell commands, a command line can be extended over multiple physical lines by using a '\' character before the newline. -->
 
 
=== त्रुटि स्ट्रीम ===
=== त्रुटि स्ट्रीम ===
डिफ़ॉल्ट रूप से, पाइपलाइन में प्रक्रियाओं की [[मानक त्रुटि धारा]]एँ (s[[tderr]]) पाइप के माध्यम से पारित नहीं होती हैं; इसके बजाय, उन्हें विलय कर दिया जाता है और [[सिस्टम कंसोल]] पर निर्देशित किया जाता है। हालाँकि, इस व्यवहार को बदलने के लिए कई शेल में अतिरिक्त सिंटैक्स होता है। [[सी खोल]] खोल में, उदाहरण के लिए, का उपयोग कर <code>|&</code> के बजाय <code>|</code> इसका मतलब है कि मानक त्रुटि स्ट्रीम को भी मानक आउटपुट के साथ विलय कर दिया जाना चाहिए और अगली प्रक्रिया में खिलाया जाना चाहिए। [[बैश (यूनिक्स शेल)]] शेल मानक त्रुटि को भी मर्ज कर सकता है <code>|&</code> संस्करण 4.0 के बाद से<ref>{{cite web|title=बैश रिलीज नोट्स|url=https://tiswww.case.edu/php/chet/bash/NEWS|website=tiswww.case.edu|access-date=2017-06-14}}</ref> या उपयोग करना <code>2>&1</code>, साथ ही इसे किसी भिन्न फ़ाइल पर पुनर्निर्देशित करें।
पाइपलाइन में प्रक्रियाओं की [[मानक त्रुटि धारा|मानक त्रुटि धाराएँ]] ("[[tderr|stderr]]") पाइप के माध्यम से पारित नहीं होती हैं; इसके अतिरिक्त , उन्हें विलय कर दिया जाता है और [[सिस्टम कंसोल]] पर निर्देशित कर दिया जाता है। चूँकि, कई शेल्स में इस व्यवहार को परिवर्तित करने के लिए अतिरिक्त सिंटैक्स होता है। उदाहरण के लिए, [[सी खोल|सीएसएच शेल]] में <code>|</code> के अतिरिक्त <code>|&</code> का उपयोग करना यह दर्शाता है कि मानक त्रुटि स्ट्रीम को भी मानक आउटपुट के साथ विलय कर आगामी प्रक्रिया में संचय किया जाना चाहिए। [[बैश (यूनिक्स शेल)]] 4.0<ref>{{cite web|title=बैश रिलीज नोट्स|url=https://tiswww.case.edu/php/chet/bash/NEWS|website=tiswww.case.edu|access-date=2017-06-14}}</ref> के पश्चात् से मानक त्रुटि को <code>|&</code> के साथ विलय कर सकता है या <code>2>&1</code> का उपयोग कर सकता है, साथ ही इसे भिन्न फ़ाइल पर पुनर्निर्देशित भी कर सकता है।         


=== पाइपमिल ===
=== पाइपमिल ===
<!-- section header used in redirect -->
सबसे अधिक उपयोग की जाने वाली सरल पाइपलाइनों में शेल पाइप के माध्यम से उप-प्रक्रियाओं की श्रृंखला को जोड़ता है, और प्रत्येक उप-प्रक्रिया के अंदर बाहरी कमांड निष्पादित करता है। इस प्रकार शेल स्वयं पाइपलाइन के माध्यम से प्रवाहित होने वाले डेटा का कोई प्रत्यक्ष प्रसंस्करण नहीं कर रहा है।
सबसे अधिक उपयोग की जाने वाली सरल पाइपलाइनों में शेल पाइप के माध्यम से उप-प्रक्रियाओं की एक श्रृंखला को जोड़ता है, और प्रत्येक उप-प्रक्रिया के भीतर बाहरी कमांड निष्पादित करता है। इस प्रकार शेल स्वयं पाइपलाइन के माध्यम से प्रवाहित होने वाले डेटा का कोई प्रत्यक्ष प्रसंस्करण नहीं कर रहा है।


हालांकि, शेल के लिए तथाकथित मिल या पिपमिल का उपयोग करके सीधे प्रसंस्करण करना संभव है (चूंकि <code lang= bash > while </code> कमांड का उपयोग प्रारंभिक कमांड से परिणामों को मिलाने के लिए किया जाता है)। यह निर्माण आम तौर पर कुछ ऐसा दिखता है:
चूँकि, शेल के लिए तथाकथित मिल या पिपमिल का उपयोग करके सीधे प्रसंस्करण करना संभव है (चूंकि <code lang= bash > while </code> कमांड का उपयोग प्रारंभिक कमांड से परिणामों को मिलाने के लिए किया जाता है)। यह निर्माण सामान्यतः कुछ ऐसा दिखता है:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
command | while read -r var1 var2 ...; do
command | while read -r var1 var2 ...; do
Line 53: Line 49:
     done
     done
</syntaxhighlight>
</syntaxhighlight>
यदि लूप की बॉडी में कमांड शामिल हैं, जैसे कि <code>cat</code> और <code>ssh</code>, जिससे पढ़ा गया <code>[[stdin]]</code>:<ref>{{cite web|url=http://72.14.189.113/howto/shell/while-ssh/|archive-url=https://web.archive.org/web/20120306135439/http://72.14.189.113/howto/shell/while-ssh/|url-status=dead|archive-date=6 March 2012|title=SSH के साथ शेल लूप इंटरेक्शन|date=6 March 2012}}</ref> लूप के पहले पुनरावृत्ति पर, ऐसा प्रोग्राम (चलिए इसे ड्रेन कहते हैं) शेष आउटपुट को पढ़ेगा <code>command</code>, और लूप तब समाप्त हो जाएगा (नाली की बारीकियों के आधार पर परिणामों के साथ)। इस व्यवहार से बचने के कुछ संभावित तरीके हैं। सबसे पहले, कुछ नालियाँ पढ़ने को अक्षम करने के विकल्प का समर्थन करती हैं <code>stdin</code> (उदा <code>ssh -n</code>). वैकल्पिक रूप से, यदि नाली को किसी इनपुट को पढ़ने की आवश्यकता नहीं है <code>stdin</code> कुछ उपयोगी करने के लिए, यह दिया जा सकता है <code>&lt; /dev/null</code> इनपुट के रूप में।
यदि लूप की बॉडी में कमांड सम्मिलित हैं, जैसे कि <code>cat</code> और <code>ssh</code>, जिससे पढ़ा गया <code>[[stdin]]</code>:<ref>{{cite web|url=http://72.14.189.113/howto/shell/while-ssh/|archive-url=https://web.archive.org/web/20120306135439/http://72.14.189.113/howto/shell/while-ssh/|url-status=dead|archive-date=6 March 2012|title=SSH के साथ शेल लूप इंटरेक्शन|date=6 March 2012}}</ref> लूप के पूर्व पुनरावृत्ति पर, ऐसा प्रोग्राम (इसे ड्रेन कहते हैं) शेष आउटपुट को <code>command</code>पढ़ेगा , और लूप तब समाप्त हो जाएगा (ड्रेन की बारीकियों के आधार पर परिणामों के साथ)। इस व्यवहार से बचने के कुछ संभावित उपाय हैं। कुछ ड्रेन <code>stdin</code> से पढ़ने को अक्षम करने के विकल्प का समर्थन करती हैं (उदाहरण के लिए <code>ssh -n</code>) I वैकल्पिक रूप से, ड्रेन को कुछ उपयोगी करने के लिए <code>stdin</code> से किसी इनपुट को पढ़ने की आवश्यकता नहीं है तो इसे इनपुट के रूप में<code>&lt; /dev/null</code> दिया जा सकता है।
 
जैसा कि एक पाइप के सभी घटक समानांतर में चलते हैं, एक शेल आमतौर पर इसकी सामग्री को संभालने के लिए एक सबप्रोसेस (एक सबशेल) को फोर्क करता है, जिससे बाहरी शेल वातावरण में परिवर्तनशील परिवर्तनों को प्रसारित करना असंभव हो जाता है। इस समस्या का समाधान करने के लिए, पिपमिल को एक [[कमांड प्रतिस्थापन]] वाले दस्तावेज़ से फीड किया जा सकता है, जो सामग्री के माध्यम से मिलिंग से पहले पाइपलाइन के चलने का इंतजार करता है। वैकल्पिक रूप से, समानांतर निष्पादन के लिए नामित पाइप या प्रक्रिया प्रतिस्थापन का उपयोग किया जा सकता है। GNU बैश में भी a {{code|lastpipe}} अंतिम पाइप घटक के लिए फोर्किंग को अक्षम करने का विकल्प।<ref>{{cite web |author=John1024 |title=मैं बैश में एक सरणी के रूप में "ढूंढें" कमांड परिणामों को कैसे संग्रहीत कर सकता हूं|url=https://stackoverflow.com/a/23357277 |website=Stack Overflow}}</ref>


जैसा कि पाइप के सभी घटक समानांतर में चलते हैं, शेल सामान्यतः इसकी सामग्री को संभालने के लिए उपप्रक्रिया (उपशेल) को फोर्क करता है, जिससे बाहरी शेल वातावरण में परिवर्तनशील परिवर्तनों को प्रसारित करना असंभव हो जाता है। इस समस्या का समाधान करने के लिए, पिपमिल को [[कमांड प्रतिस्थापन]] वाले प्रपत्र से संचय किया जा सकता है, जो सामग्री के माध्यम से मिलिंग से पहले पाइपलाइन के चलने का प्रतीक्षा करता है। वैकल्पिक रूप से, समानांतर निष्पादन के लिए नामित पाइप या प्रक्रिया प्रतिस्थापन का उपयोग किया जा सकता है। जीएनयू बैश में भी a {{code|lastpipe}} अंतिम पाइप घटक के लिए फोर्किंग को अक्षम करने का विकल्प भी होता है।<ref>{{cite web |author=John1024 |title=मैं बैश में एक सरणी के रूप में "ढूंढें" कमांड परिणामों को कैसे संग्रहीत कर सकता हूं|url=https://stackoverflow.com/a/23357277 |website=Stack Overflow}}</ref>
== प्रोग्रामेटिक रूप से पाइपलाइन निर्मित करना ==
कार्यक्रम नियंत्रण के अंतर्गत पाइपलाइनों का निर्माण किया जा सकता है। यूनिक्स <code>pipe()</code> [[सिस्टम कॉल|प्रणाली कॉल]] परिचालन प्रणाली को नया अज्ञात पाइप लक्ष्य बनाने के लिए कहता है। इसके परिणामस्वरूप प्रक्रिया में दो नए, खुले [[फाइल डिस्क्रिप्टर|फाइल वर्णनकर्ता]] होते हैं: पाइप का केवल-पढ़ने वाला अंत, और केवल-लिखने वाला अंत पाइप के सिरे सामान्य, अज्ञात फ़ाइल वर्णनकर्ता प्रतीत होते हैं, अतिरिक्त इसके कि उनमें खोज करने की कोई क्षमता नहीं होती है।


== प्रोग्रामेटिक रूप से पाइपलाइन बनाना ==
[[ गतिरोध |गतिरोध]] से बचने और समांतरता का लाभ प्राप्त करने के लिए, अधिक नए पाइपों के साथ यूनिक्स प्रक्रिया सामान्यतः नई प्रक्रियाएँ बनाने के लिए <code>[[fork (system call)|fork()]]</code> को कॉल करेगी I प्रत्येक प्रक्रिया किसी भी डेटा का उत्पादन या उपभोग करने से पहले पाइप के शीर्षो को बंद कर देगी जिनका वह उपयोग नहीं करेगा I वैकल्पिक रूप से, प्रक्रिया नए [[pthreads|पथ्रेडस]] बना सकती है और उनके मध्य संचार करने के लिए पाइप का उपयोग कर सकती है।  
कार्यक्रम नियंत्रण के तहत पाइपलाइनों का निर्माण किया जा सकता है। यूनिक्स <code>pipe()</code> [[सिस्टम कॉल]] ऑपरेटिंग सिस्टम को एक नया अज्ञात पाइप ऑब्जेक्ट बनाने के लिए कहता है। इसके परिणामस्वरूप प्रक्रिया में दो नए, खुले [[फाइल डिस्क्रिप्टर]] होते हैं: पाइप का केवल-पढ़ने वाला अंत, और केवल-लिखने वाला अंत। पाइप के सिरे सामान्य, अनाम फ़ाइल डिस्क्रिप्टर प्रतीत होते हैं, सिवाय इसके कि उनमें खोज करने की कोई क्षमता नहीं है।


[[ गतिरोध ]] से बचने और समांतरता का फायदा उठाने के लिए, एक या अधिक नए पाइपों के साथ यूनिक्स प्रक्रिया आम तौर पर कॉल करेगी <code>[[fork (system call)|fork()]]</code> नई प्रक्रियाएँ बनाने के लिए। प्रत्येक प्रक्रिया तब पाइप के अंत (ओं) को बंद कर देगी जिसका उपयोग किसी भी डेटा का उत्पादन या उपभोग करने से पहले नहीं किया जाएगा। वैकल्पिक रूप से, एक प्रक्रिया नए [[pthreads]] बना सकती है और उनके बीच संवाद करने के लिए पाइप का उपयोग कर सकती है।
नामित पाइपों को <code>mkfifo()</code> या <code>[[mknod]]()</code> का उपयोग करके भी बनाया जा सकता है  और फिर प्रोग्रामों में इनपुट या आउटपुट फ़ाइल के रूप में प्रस्तुत किया जाता है क्योंकि उन्हें प्रारम्भ किया जाता है। वे मल्टी-पाथ पाइप बनाने की अनुमति देते हैं, और मानक त्रुटि पुनर्निर्देशन, या <code>[[tee (command)|tee]]</code> के साथ संयुक्त होने पर विशेष रूप से प्रभावी होते हैं। .
 
नामांकित पाइप का उपयोग करके भी बनाया जा सकता है <code>mkfifo()</code> या <code>[[mknod]]()</code> और फिर प्रोग्राम में इनपुट या आउटपुट फ़ाइल के रूप में प्रस्तुत किया जाता है, जैसा कि उन्हें लागू किया जाता है। वे बहु-पथ पाइपों को बनाने की अनुमति देते हैं, और विशेष रूप से प्रभावी होते हैं जब मानक त्रुटि पुनर्निर्देशन या के साथ संयुक्त होते हैं <code>[[tee (command)|tee]]</code>.


== कार्यान्वयन ==
== कार्यान्वयन ==
अधिकांश यूनिक्स जैसी प्रणालियों में, एक पाइपलाइन की सभी प्रक्रियाएं एक ही समय में शुरू होती हैं, उनकी धाराएं उचित रूप से जुड़ी होती हैं<!--details please: buffering-->, और मशीन पर चलने वाली अन्य सभी प्रक्रियाओं के साथ [[ निर्धारण (कंप्यूटिंग) ]] द्वारा प्रबंधित किया जाता है। <!--death of a process, broken pipes, signal handling, etc.--> इसका एक महत्वपूर्ण पहलू, यूनिक्स पाइप को अन्य पाइप कार्यान्वयन से अलग करना, बफ़र (कंप्यूटर विज्ञान) की अवधारणा है: उदाहरण के लिए एक भेजने वाला प्रोग्राम प्रति सेकंड 5000 बाइट उत्पन्न कर सकता है, और एक प्राप्त करने वाला प्रोग्राम केवल 100 बाइट प्रति सेकंड स्वीकार करने में सक्षम हो सकता है [[दूसरा]], लेकिन कोई डेटा गुम नहीं हुआ है। इसके बजाय, भेजने वाले प्रोग्राम का आउटपुट बफर में रखा जाता है। जब प्राप्त करने वाला प्रोग्राम डेटा पढ़ने के लिए तैयार होता है, तो पाइपलाइन में अगला प्रोग्राम बफर से पढ़ता है। यदि बफ़र भरा हुआ है, तो प्रेषण कार्यक्रम को तब तक रोक दिया जाता है (अवरुद्ध) जब तक कि रिसीवर द्वारा बफ़र से कम से कम कुछ डेटा हटा नहीं दिया जाता है। लिनक्स में, बफर का आकार 65,536 [[बाइट्स]] (64KiB) है। [https://linux.die.net/man/1/bfr bfr] नामक एक खुला स्रोत तृतीय-पक्ष फ़िल्टर आवश्यकता पड़ने पर बड़े बफ़र प्रदान करने के लिए उपलब्ध है।
अधिकांश यूनिक्स जैसी प्रणालियों में, पाइपलाइन की सभी प्रक्रियाएं एक ही समय में प्रारम्भ होती हैं, उनकी धाराएं उचित रूप से जुड़ी होती हैं, और मशीन पर चलने वाली अन्य सभी प्रक्रियाओं के साथ [[ निर्धारण (कंप्यूटिंग) |निर्धारण (कंप्यूटिंग)]] द्वारा प्रबंधित की जाती है। इसका महत्वपूर्ण विषय, यूनिक्स पाइप को अन्य पाइप कार्यान्वयन से पृथक करना और बफ़र (कंप्यूटर विज्ञान) की अवधारणा है: उदाहरण के लिए प्रेक्षित होने वाला प्रोग्राम प्रति सेकंड 5000 बाइट उत्पन्न कर सकता है, और प्राप्त करने वाला प्रोग्राम केवल 100 बाइट प्रति सेकंड स्वीकार करने में सक्षम हो सकता है, [[दूसरा]] लेकिन कोई डेटा विलुप्त नहीं हुआ है। इसके अतिरिक्त, प्रेक्षित होने वाले प्रोग्राम का आउटपुट बफर में रखा जाता है। जब प्राप्त करने वाला प्रोग्राम डेटा पढ़ने के लिए उपस्थित होता है, तो पाइपलाइन में आगामी प्रोग्राम बफर से पढ़ता है। यदि बफ़र भरा हुआ है, तो प्रेषण कार्यक्रम को तब तक रोक दिया जाता है (अवरुद्ध) जब तक कि रिसीवर द्वारा बफ़र से कम से कम कुछ डेटा हटा नहीं दिया जाता है। लिनक्स में, बफर का आकार 65,536 [[बाइट्स]] (64KiB) है। [https://linux.die.net/man/1/bfr bfr] नामक ओपन स्रोत तृतीय-पक्ष फ़िल्टर आवश्यकता पड़ने पर बड़े बफ़र प्रदान करने के लिए उपलब्ध है।


=== नेटवर्क पाइप ===
=== नेटवर्क पाइप ===
[[netcat]] और [[socat]] जैसे उपकरण पाइपों को TCP/IP [[इंटरनेट सॉकेट]] से जोड़ सकते हैं।
[[netcat|नेटकैट]] और [[socat|सोकेट]] जैसे उपकरण पाइपों को टीसीपी/आईपी [[इंटरनेट सॉकेट|इंटरनेट परिपथ]] से जोड़ सकते हैं।


== इतिहास ==
== इतिहास ==
<!-- Image with inadequate rationale removed: [[File:Automator Icon.png|thumb|75px|right|Apple Automator logo]]  -->
पाइपलाइन अवधारणा का आविष्कार डगलस मैक्लॉयय ने किया था,<ref name="crea">{{cite web |title=UNIX ऑपरेटिंग सिस्टम का निर्माण|url=http://csdev.cas.upm.edu.ph/~pfalcone/compsci/unix/unix-history1.html |publisher=Bell Labs |archive-url=https://web.archive.org/web/20040914025332/http://csdev.cas.upm.edu.ph/~pfalcone/compsci/unix/unix-history1.html |archive-date=September 14, 2004 }}</ref> और प्रथम [[संस्करण 3 यूनिक्स]] के [[मैन पेज|मैन पेजों]] में वर्णित है।<ref name="reader">{{cite techreport |first1=M. D. |last1=McIlroy |author-link1=Doug McIlroy |year=1987 |url=http://www.cs.dartmouth.edu/~doug/reader.pdf |title=A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 |series=CSTR |number=139 |institution=Bell Labs}}</ref> मैकिलॉय ने देखा कि अधिकांश समय [[ यूनिक्स खोल |यूनिक्स शेल]] ने आउटपुट फ़ाइल को प्रोग्राम से दूसरे में इनपुट के रूप में पारित किया है।
पाइपलाइन अवधारणा का आविष्कार डगलस मैक्लॉयय ने किया था<ref name="crea">{{cite web |title=UNIX ऑपरेटिंग सिस्टम का निर्माण|url=http://csdev.cas.upm.edu.ph/~pfalcone/compsci/unix/unix-history1.html |publisher=Bell Labs |archive-url=https://web.archive.org/web/20040914025332/http://csdev.cas.upm.edu.ph/~pfalcone/compsci/unix/unix-history1.html |archive-date=September 14, 2004 }}</ref> और पहले [[संस्करण 3 यूनिक्स]] के [[मैन पेज]]ों में वर्णित है।<ref name="reader">{{cite techreport |first1=M. D. |last1=McIlroy |author-link1=Doug McIlroy |year=1987 |url=http://www.cs.dartmouth.edu/~doug/reader.pdf |title=A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 |series=CSTR |number=139 |institution=Bell Labs}}</ref> McIlroy ने देखा कि अधिकांश समय [[ यूनिक्स खोल ]] ने आउटपुट फ़ाइल को एक प्रोग्राम से दूसरे में इनपुट के रूप में पारित किया।


उनके विचारों को 1973 में लागू किया गया था जब (मैकइलरॉय ने लिखा था, एक बुखार भरी रात में) [[केन थॉम्पसन]] ने <code>pipe()</code> संस्करण 3 यूनिक्स में शेल और कई उपयोगिताओं के लिए सिस्टम कॉल और पाइप। अगले दिन, मैक्लरॉय ने जारी रखा, एक-लाइनर्स का एक अविस्मरणीय तांडव देखा, क्योंकि हर कोई प्लंबिंग के उत्साह में शामिल हो गया। McIlroy भी थॉम्पसन को इसका श्रेय देता है <code>|</code> अंकन, जिसने [[संस्करण 4 यूनिक्स]] में पाइप सिंटैक्स के विवरण को बहुत सरल बना दिया।<ref>http://www.linfo.org/pipe.html Pipes: A Brief Introduction by The Linux Information Project (LINFO)</ref>{{r|reader}}
उनके विचारों को 1973 में प्रस्तावित किया गया था, जब (मैकइलरॉय ने लिखा था, विह्वल रात में) [[केन थॉम्पसन]] ने शेल में <code>pipe()</code> प्रणाली कॉल और पाइप और संस्करण 3 यूनिक्स में कई उपयोगिताओं को जोड़ा। मैक्लरॉय ने प्रारम्भ रखा, एक-लाइनर्स का अविस्मरणीय आर्गी देखा, क्योंकि प्लंबिंग के उत्साह में सम्मिलित हो गया। मैकिलॉय भी थॉम्पसन को इसका श्रेय देता है <code>|</code> अंकन, जिसने [[संस्करण 4 यूनिक्स]] में पाइप सिंटैक्स के विवरण को बहुत सरल बना दिया।<ref>http://www.linfo.org/pipe.html Pipes: A Brief Introduction by The Linux Information Project (LINFO)</ref>{{r|reader}}


हालांकि स्वतंत्र रूप से विकसित, यूनिक्स पाइप केन लोचनर द्वारा विकसित 'संचार फाइलों' से संबंधित हैं, और इससे पहले थे <ref>http://www.cs.rit.edu/~swm/history/DTSS.doc {{Bare URL DOC|date=June 2022}}</ref> 1960 के दशक में [[डार्टमाउथ टाइम शेयरिंग सिस्टम]] के लिए।<ref>{{cite web |url=http://cm.bell-labs.com/who/dmr/hist.html |title=आंकड़े|website=cm.bell-labs.com |access-date=22 May 2022 |archive-url=https://web.archive.org/web/19990220165130/http://cm.bell-labs.com/who/dmr/hist.html |archive-date=20 February 1999 |url-status=dead}}</ref>
यद्यपि स्वतंत्र रूप से विकसित, यूनिक्स पाइप 1960 के दशक में [[डार्टमाउथ टाइम शेयरिंग सिस्टम|डार्टमाउथ टाइम शेयरिंग प्रणाली]] के लिए केन लोचनर <ref>http://www.cs.rit.edu/~swm/history/DTSS.doc {{Bare URL DOC|date=June 2022}}</ref> द्वारा विकसित 'संचार फ़ाइलें' से संबंधित हैं, और उनसे पूर्व भी थे।<ref>{{cite web |url=http://cm.bell-labs.com/who/dmr/hist.html |title=आंकड़े|website=cm.bell-labs.com |access-date=22 May 2022 |archive-url=https://web.archive.org/web/19990220165130/http://cm.bell-labs.com/who/dmr/hist.html |archive-date=20 February 1999 |url-status=dead}}</ref> टोनी होरे की संचार [[ अनुक्रमिक प्रक्रियाओं का संचार करना |अनुक्रमिक प्रक्रियाओं का संचार करना]] (सीएसपी) में मैकिलॉय के पाइपों को और अधिक विकसित किया गया है।<ref>https://swtch.com/~rsc/thread/ Bell Labs and CSP Threads (Russ Cox)</ref> [[एप्पल कंप्यूटर]] [[ स्वचालक (सॉफ्टवेयर) |स्वचालक (सॉफ्टवेयर)]] के आइकन में रोबोट, जो पुनरावृत्ति किये जाने वाले आदेशों को साथ में श्रृंखलाबद्ध करने के लिए पाइपलाइन अवधारणा का भी उपयोग करता है, मूल यूनिक्स अवधारणा के सम्मान में पाइप रखता है I
टोनी होरे में | टोनी होरे की [[ अनुक्रमिक प्रक्रियाओं का संचार करना ]] (CSP) मेक्लोरी के पाइपों को और विकसित किया गया है।<ref>https://swtch.com/~rsc/thread/ Bell Labs and CSP Threads (Russ Cox)</ref>
[[एप्पल कंप्यूटर]] के [[ स्वचालक (सॉफ्टवेयर) ]] के आइकन में रोबोट, जो एक साथ दोहराए जाने वाले आदेशों को श्रृंखलाबद्ध करने के लिए एक पाइपलाइन अवधारणा का भी उपयोग करता है, मूल यूनिक्स अवधारणा के लिए श्रद्धांजलि में एक पाइप रखता है।


=== अन्य ऑपरेटिंग सिस्टम ===
=== अन्य परिचालन सिस्टम ===
{{Main article|Pipeline (software)}}
{{Main article|पाइपलाइन (सॉफ्टवेयर)}}
यूनिक्स की इस विशेषता को अन्य ऑपरेटिंग सिस्टम, जैसे [[MS-DOS]] और VM/CMS और [[MVS]] पर CMS पाइपलाइन पैकेज द्वारा उधार लिया गया था, और अंततः [[सॉफ्टवेयर इंजीनियरिंग]] की [[पाइपलाइन (सॉफ्टवेयर)]] के रूप में नामित किया गया।
 
यूनिक्स की इस विशेषता को अन्य परिचालन प्रणाली, जैसे [[MS-DOS|एमएस-डॉस]] और वीएम/सीएमएस और [[MVS|एमवीएस]] पर सीएमएस पाइपलाइन पैकेज द्वारा उधार लिया गया था, और अंततः [[सॉफ्टवेयर इंजीनियरिंग]] की [[पाइपलाइन (सॉफ्टवेयर)]] के रूप में नामित किया गया है।


== यह भी देखें ==
== यह भी देखें ==
* [[सब कुछ एक फाइल है]] - यूनिक्स की परिभाषित विशेषताओं में से एक का वर्णन करता है; पाइपलाइनें यूनिक्स अर्थ में फाइलों पर काम करती हैं
* [[सब कुछ एक फाइल है|प्रत्येक चीज़ फाइल है]] - यूनिक्स की परिभाषित विशेषताओं में से एक का वर्णन करता है; यूनिक्स अर्थ में पाइपलाइनें "फ़ाइलों" पर कार्य करती हैं I
* बेनामी पाइप - इंटरप्रोसेस संचार के लिए उपयोग की जाने वाली एक फीफो संरचना
* अनाम पाइप - फीफो संरचना जिसका उपयोग अंतरप्रक्रिया संचार के लिए किया जाता है
* [[जीस्ट्रीमर]] - एक पाइपलाइन आधारित मल्टीमीडिया ढांचा
* [[जीस्ट्रीमर]] - पाइपलाइन आधारित मल्टीमीडिया ढांचा
* सीएमएस पाइपलाइन
* सीएमएस पाइपलाइन
* पुनरावृति
* पुनरावृति
* नामित पाइप - इंटरप्रोसेस संचार के लिए उपयोग किए जाने वाले लगातार पाइप
* नामित पाइप - अंतरप्रक्रिया संचार के लिए उपयोग किए जाने वाले दृढ़ पाइप
* प्रक्रिया प्रतिस्थापन - एक प्रक्रिया में कई पाइपों को जोड़ने के लिए शेल सिंटैक्स
* प्रक्रिया प्रतिस्थापन - प्रक्रिया में कई पाइपों को जोड़ने के लिए शेल सिंटैक्स
* [[जीएनयू समानांतर]]
* [[जीएनयू समानांतर]]
* [[पाइपलाइन (कंप्यूटिंग)]] - कंप्यूटर से संबंधित अन्य पाइपलाइन
* [[पाइपलाइन (कंप्यूटिंग)]] - कंप्यूटर से संबंधित अन्य पाइपलाइन
* [[पुनर्निर्देशन (कंप्यूटिंग)]]
* [[पुनर्निर्देशन (कंप्यूटिंग)]]
* [[टी (कमांड)]] - पाइपलाइन से डेटा टैप करने के लिए एक सामान्य कमांड
* [[टी (कमांड)]] - पाइपलाइन से डेटा टैप करने के लिए सामान्य कमांड
* [[एक्सएमएल पाइपलाइन]] - एक्सएमएल फाइलों के प्रसंस्करण के लिए
* [[एक्सएमएल पाइपलाइन]] - एक्सएमएल फाइलों के प्रसंस्करण के लिए
* ज़र्ग
* ज़र्ग
Line 117: Line 109:
*[https://web.archive.org/web/20170911203245/https://debian-administration.org/article/145/use_and_abuse_of_pipes_with_audio_data Use And Abuse Of Pipes With Audio Data] – Gives an introduction to using and abusing pipes with netcat, nettee and fifos to play audio across a network.
*[https://web.archive.org/web/20170911203245/https://debian-administration.org/article/145/use_and_abuse_of_pipes_with_audio_data Use And Abuse Of Pipes With Audio Data] – Gives an introduction to using and abusing pipes with netcat, nettee and fifos to play audio across a network.
*[https://stackoverflow.com/questions/19122/bash-pipe-handling stackoverflow.com] – A Q&A about bash pipeline handling.
*[https://stackoverflow.com/questions/19122/bash-pipe-handling stackoverflow.com] – A Q&A about bash pipeline handling.
[[Category: अंतःप्रक्रम संचार]] [[Category: यूनिक्स]]
 


[[sv:Vertikalstreck#Datavetenskap]]
[[sv:Vertikalstreck#Datavetenskap]]


 
[[Category:All articles with bare URLs for citations]]
 
[[Category:Articles with DOC/DOCX file bare URLs for citations]]
[[Category: Machine Translated Page]]
[[Category:Articles with bare URLs for citations from June 2022]]
[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category:Created On 19/06/2023]]
[[Category:Created On 19/06/2023]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Templates Vigyan Ready]]
[[Category:Webarchive template wayback links]]
[[Category:अंतःप्रक्रम संचार]]
[[Category:यूनिक्स]]

Latest revision as of 14:51, 14 July 2023

टेक्स्ट टर्मिनल पर गति करने वाली तीन प्रोग्राम प्रक्रियाओं की पाइपलाइन

यूनिक्स जैसे कंप्यूटर परिचालन प्रणाली में, पाइपलाइन संदेश मार्ग का उपयोग करके अंतर-प्रक्रिया संचार के लिए तंत्र होता है। पाइपलाइन उनकी मानक धाराओं द्वारा श्रृंखलाबद्ध प्रक्रिया (कंप्यूटिंग) का समूह है, जिससे प्रत्येक प्रक्रिया का आउटपुट पाठ (स्टडआउट) सीधे इनपुट (स्टडिन) के रूप में आगामी में पारित हो जाए। द्वितीय प्रक्रिया प्रारम्भ की जाती है क्योंकि प्रथम प्रक्रिया अभी भी निष्पादित हो रही है, और और उन्हें समवर्ती रूप से निष्पादित किया जाता हैI

पाइपलाइनों की अवधारणा को यूनिक्स के विकास के समय, इसके उपकरण बॉक्स दर्शन को आकार देते हुए, यूनिक्स के पैतृक होम बेल लैब्स में डगलस मैक्लॉयय द्वारा समर्थित किया गया था, जिसने इसके यूनिक्स दर्शन को आकार दिया था।[1][2] इसे भौतिक पाइपलाइन परिवहन के सादृश्य द्वारा नामित किया गया है। इन पाइपलाइनों की प्रमुख विशेषता उनके आंतरिक (रिची एंड थॉम्पसन, 1974) भागों को गुप्त रखना है। यह परिणाम स्वरुप प्रणाली में अधिक स्पष्टता और सरलता की अनुमति देता है।

यह लेख अज्ञात पाइपों के सम्बन्ध में है, जहां प्रक्रिया द्वारा लिखे गए डेटा को परिचालन प्रणाली द्वारा तब तक बफर किया जाता है जब तक कि इसे आगामी प्रक्रिया द्वारा पढ़ा नहीं जाता है, और प्रक्रियाएं पूर्ण होने पर यह यूनिडायरेक्शनल चैनल विलुप्त हो जाता है। यह नामित पाइपों से भिन्न होता है, जहां संदेशों को पाइप से या उससे निकट किया जाता है, जिसे फ़ाइल बनाकर नामित किया जाता है, और प्रक्रियाएं पूर्ण होने के पश्चात् भी बनी रहती हैं। अज्ञात पाइपों के लिए मानक शैल (कंप्यूटिंग) सिंटैक्स कई कमांडों को सूचीबद्ध करना है, जो ऊर्ध्वाधर पट्टियों (सामान्य यूनिक्स शब्दाडंबर में "पाइप") से भिन्न होते हैं:

command1 | command2 | command3

उदाहरण के लिए, वर्तमान निर्देशिका (ls), में फ़ाइलों को सूचीबद्ध करने के लिए, स्ट्रिंग "key" (grep) वाले ls आउटपुट की केवल पंक्तियों को बनाए रखें, और परिणाम को स्क्रॉलिंग पेज (less) में देखें, उपयोगकर्ता अंतिम स्टेशन की कमांड लाइन में निम्नलिखित टाइप करता है:

ls -l | grep key | less

कमांड ls -l को प्रक्रिया के रूप में निष्पादित किया जाता है, जिसके आउटपुट (स्टडआउट) grep keyको प्रक्रिया के इनपुट (स्टडिन) पर पाइप किया जाता है ; और इसी प्रकार प्रक्रिया के लिए lessप्रक्रिया (कंप्यूटिंग) पूर्व प्रक्रिया से इनपुट प्राप्त करती है, और मानक स्ट्रीम के माध्यम से आगामी प्रक्रिया के लिए आउटपुट उत्पन्न करती है। प्रत्येक | शेल को बायीं ओर कमांड के मानक आउटपुट को दाहिनी ओर कमांड के मानक इनपुट से कनेक्ट करने के लिए कमांड प्रदान करता है, जिसे परिचालन प्रणाली में कार्यान्वित अज्ञात पाइप कहा जाता है। पाइप्स यूनिडायरेक्शनल हैं; डेटा पाइपलाइन के माध्यम से बाएं से दाएं जाता है।

उदाहरण

नीचे पाइपलाइन का उदाहरण दिया गया है जो यूनिफ़ॉर्म रिसोर्स लोकेटर वर्ल्ड वाइड वेब संसाधन के लिए वर्तनी बानान चेकर प्रारम्भ करता है। यह क्या करता है इसका स्पष्टीकरण इस प्रकार है।

curl "https://en.wikipedia.org/wiki/Pipeline_(Unix)" |
sed 's/[^a-zA-Z ]/ /g' |
tr 'A-Z ' 'a-z\n' |
grep '[a-z]' |
sort -u |
comm -23 - <(sort /usr/share/dict/words) |
less
  1. curlवेब पेज की HTML सामग्री प्राप्त करता है (उपयोग कर सकता है wget कुछ प्रणालियों पर)।
  2. sedसभी वर्णों (वेब ​​पृष्ठ की सामग्री से) को रिक्त स्थान से परिवर्तित कर देता है जो रिक्त स्थान या अक्षर नहीं हैं। (नई पंक्ति संरक्षित हैं।)
  3. trसभी अपरकेस अक्षरों को लोअरकेस में परिवर्तित कर देता है, और रिक्त स्थान को टेक्स्ट की पंक्तियों में न्यूलाइन्स में परिवर्तित कर देता है (प्रत्येक 'शब्द' अब भिन्न लाइन पर है)।
  4. grepकेवल उन पंक्तियों को सम्मिलित करता है जिनमें कम से कम लोअरकेस वर्णानुक्रमिक वर्ण होता है (किसी भी रिक्त रेखा को त्यागते हुए)।
  5. sort'शब्दों' की सूची को वर्णानुक्रम में क्रमबद्ध करता है, और -u स्विच प्रतिरूप त्यागता है।
  6. commदो फाइलों के मध्य सामान्य लाइनों को परिक्षण करता है, -23 दूसरी फ़ाइल के लिए अद्वितीय पंक्तियों को दबा देता है, और जो दोनों के लिए सामान्य हैं, केवल उन कमांड को त्यागकर जो केवल प्रथम फ़ाइल में पाए जाते हैं। - e> फ़ाइल नाम के स्थान पर कारण बनता है, comm इसके मानक इनपुट (इस विषय में पाइप लाइन से) का उपयोग करने के लिए। sort /usr/share/dict/words की सामग्री को क्रमबद्ध करता है words फ़ाइल वर्णानुक्रम में, as comm अपेक्षा करता है, और <( ... ) परिणामों को अस्थायी फ़ाइल (प्रक्रिया प्रतिस्थापन के माध्यम से) में आउटपुट करता है, जो comm पढ़ता है। परिणाम उन शब्दों (पंक्तियों) की सूची है जो /usr/share/dict/words में नहीं पाए जाते हैं।
  7. lessउपयोगकर्ता को परिणामों के माध्यम से पेज करने की अनुमति देता है।

कमांड लाइन इंटरफेस में पाइपलाइन

सभी व्यापक रूप से उपयोग किए जाने वाले यूनिक्स शेल में पाइपलाइनों के निर्माण के लिए विशेष सिंटैक्स निर्माण होता है। सभी उपयोगों में व्यक्ति ASCII ऊर्ध्वाधर बार |कैरेक्टर द्वारा पृथक किए गए क्रम में कमांड लिखता है (जिसे, इस कारण से, प्रायः "पाइप पात्र" कहा जाता है)। शेल प्रक्रियाएं शुरू करता है और उनकी मानक धाराओं (कुछ मात्रा में बफर (कंप्यूटर विज्ञान) सहित) के मध्य आवश्यक सम्बन्ध की व्यवस्था करता है।

त्रुटि स्ट्रीम

पाइपलाइन में प्रक्रियाओं की मानक त्रुटि धाराएँ ("stderr") पाइप के माध्यम से पारित नहीं होती हैं; इसके अतिरिक्त , उन्हें विलय कर दिया जाता है और सिस्टम कंसोल पर निर्देशित कर दिया जाता है। चूँकि, कई शेल्स में इस व्यवहार को परिवर्तित करने के लिए अतिरिक्त सिंटैक्स होता है। उदाहरण के लिए, सीएसएच शेल में | के अतिरिक्त |& का उपयोग करना यह दर्शाता है कि मानक त्रुटि स्ट्रीम को भी मानक आउटपुट के साथ विलय कर आगामी प्रक्रिया में संचय किया जाना चाहिए। बैश (यूनिक्स शेल) 4.0[3] के पश्चात् से मानक त्रुटि को |& के साथ विलय कर सकता है या 2>&1 का उपयोग कर सकता है, साथ ही इसे भिन्न फ़ाइल पर पुनर्निर्देशित भी कर सकता है।

पाइपमिल

सबसे अधिक उपयोग की जाने वाली सरल पाइपलाइनों में शेल पाइप के माध्यम से उप-प्रक्रियाओं की श्रृंखला को जोड़ता है, और प्रत्येक उप-प्रक्रिया के अंदर बाहरी कमांड निष्पादित करता है। इस प्रकार शेल स्वयं पाइपलाइन के माध्यम से प्रवाहित होने वाले डेटा का कोई प्रत्यक्ष प्रसंस्करण नहीं कर रहा है।

चूँकि, शेल के लिए तथाकथित मिल या पिपमिल का उपयोग करके सीधे प्रसंस्करण करना संभव है (चूंकि while कमांड का उपयोग प्रारंभिक कमांड से परिणामों को मिलाने के लिए किया जाता है)। यह निर्माण सामान्यतः कुछ ऐसा दिखता है:

command | while read -r var1 var2 ...; do
    # process each line, using variables as parsed into var1, var2, etc
    # (note that this may be a subshell: var1, var2 etc will not be available
    # after the while loop terminates; some shells, such as zsh and newer
    # versions of Korn shell, process the commands to the left of the pipe
    # operator in a subshell)
    done

यदि लूप की बॉडी में कमांड सम्मिलित हैं, जैसे कि cat और ssh, जिससे पढ़ा गया stdin:[4] लूप के पूर्व पुनरावृत्ति पर, ऐसा प्रोग्राम (इसे ड्रेन कहते हैं) शेष आउटपुट को commandपढ़ेगा , और लूप तब समाप्त हो जाएगा (ड्रेन की बारीकियों के आधार पर परिणामों के साथ)। इस व्यवहार से बचने के कुछ संभावित उपाय हैं। कुछ ड्रेन stdin से पढ़ने को अक्षम करने के विकल्प का समर्थन करती हैं (उदाहरण के लिए ssh -n) I वैकल्पिक रूप से, ड्रेन को कुछ उपयोगी करने के लिए stdin से किसी इनपुट को पढ़ने की आवश्यकता नहीं है तो इसे इनपुट के रूप में< /dev/null दिया जा सकता है।

जैसा कि पाइप के सभी घटक समानांतर में चलते हैं, शेल सामान्यतः इसकी सामग्री को संभालने के लिए उपप्रक्रिया (उपशेल) को फोर्क करता है, जिससे बाहरी शेल वातावरण में परिवर्तनशील परिवर्तनों को प्रसारित करना असंभव हो जाता है। इस समस्या का समाधान करने के लिए, पिपमिल को कमांड प्रतिस्थापन वाले प्रपत्र से संचय किया जा सकता है, जो सामग्री के माध्यम से मिलिंग से पहले पाइपलाइन के चलने का प्रतीक्षा करता है। वैकल्पिक रूप से, समानांतर निष्पादन के लिए नामित पाइप या प्रक्रिया प्रतिस्थापन का उपयोग किया जा सकता है। जीएनयू बैश में भी a lastpipe अंतिम पाइप घटक के लिए फोर्किंग को अक्षम करने का विकल्प भी होता है।[5]

प्रोग्रामेटिक रूप से पाइपलाइन निर्मित करना

कार्यक्रम नियंत्रण के अंतर्गत पाइपलाइनों का निर्माण किया जा सकता है। यूनिक्स pipe() प्रणाली कॉल परिचालन प्रणाली को नया अज्ञात पाइप लक्ष्य बनाने के लिए कहता है। इसके परिणामस्वरूप प्रक्रिया में दो नए, खुले फाइल वर्णनकर्ता होते हैं: पाइप का केवल-पढ़ने वाला अंत, और केवल-लिखने वाला अंत पाइप के सिरे सामान्य, अज्ञात फ़ाइल वर्णनकर्ता प्रतीत होते हैं, अतिरिक्त इसके कि उनमें खोज करने की कोई क्षमता नहीं होती है।

गतिरोध से बचने और समांतरता का लाभ प्राप्त करने के लिए, अधिक नए पाइपों के साथ यूनिक्स प्रक्रिया सामान्यतः नई प्रक्रियाएँ बनाने के लिए fork() को कॉल करेगी I प्रत्येक प्रक्रिया किसी भी डेटा का उत्पादन या उपभोग करने से पहले पाइप के शीर्षो को बंद कर देगी जिनका वह उपयोग नहीं करेगा I वैकल्पिक रूप से, प्रक्रिया नए पथ्रेडस बना सकती है और उनके मध्य संचार करने के लिए पाइप का उपयोग कर सकती है।

नामित पाइपों को mkfifo() या mknod() का उपयोग करके भी बनाया जा सकता है और फिर प्रोग्रामों में इनपुट या आउटपुट फ़ाइल के रूप में प्रस्तुत किया जाता है क्योंकि उन्हें प्रारम्भ किया जाता है। वे मल्टी-पाथ पाइप बनाने की अनुमति देते हैं, और मानक त्रुटि पुनर्निर्देशन, या tee के साथ संयुक्त होने पर विशेष रूप से प्रभावी होते हैं। .

कार्यान्वयन

अधिकांश यूनिक्स जैसी प्रणालियों में, पाइपलाइन की सभी प्रक्रियाएं एक ही समय में प्रारम्भ होती हैं, उनकी धाराएं उचित रूप से जुड़ी होती हैं, और मशीन पर चलने वाली अन्य सभी प्रक्रियाओं के साथ निर्धारण (कंप्यूटिंग) द्वारा प्रबंधित की जाती है। इसका महत्वपूर्ण विषय, यूनिक्स पाइप को अन्य पाइप कार्यान्वयन से पृथक करना और बफ़र (कंप्यूटर विज्ञान) की अवधारणा है: उदाहरण के लिए प्रेक्षित होने वाला प्रोग्राम प्रति सेकंड 5000 बाइट उत्पन्न कर सकता है, और प्राप्त करने वाला प्रोग्राम केवल 100 बाइट प्रति सेकंड स्वीकार करने में सक्षम हो सकता है, दूसरा लेकिन कोई डेटा विलुप्त नहीं हुआ है। इसके अतिरिक्त, प्रेक्षित होने वाले प्रोग्राम का आउटपुट बफर में रखा जाता है। जब प्राप्त करने वाला प्रोग्राम डेटा पढ़ने के लिए उपस्थित होता है, तो पाइपलाइन में आगामी प्रोग्राम बफर से पढ़ता है। यदि बफ़र भरा हुआ है, तो प्रेषण कार्यक्रम को तब तक रोक दिया जाता है (अवरुद्ध) जब तक कि रिसीवर द्वारा बफ़र से कम से कम कुछ डेटा हटा नहीं दिया जाता है। लिनक्स में, बफर का आकार 65,536 बाइट्स (64KiB) है। bfr नामक ओपन स्रोत तृतीय-पक्ष फ़िल्टर आवश्यकता पड़ने पर बड़े बफ़र प्रदान करने के लिए उपलब्ध है।

नेटवर्क पाइप

नेटकैट और सोकेट जैसे उपकरण पाइपों को टीसीपी/आईपी इंटरनेट परिपथ से जोड़ सकते हैं।

इतिहास

पाइपलाइन अवधारणा का आविष्कार डगलस मैक्लॉयय ने किया था,[6] और प्रथम संस्करण 3 यूनिक्स के मैन पेजों में वर्णित है।[7] मैकिलॉय ने देखा कि अधिकांश समय यूनिक्स शेल ने आउटपुट फ़ाइल को प्रोग्राम से दूसरे में इनपुट के रूप में पारित किया है।

उनके विचारों को 1973 में प्रस्तावित किया गया था, जब (मैकइलरॉय ने लिखा था, विह्वल रात में) केन थॉम्पसन ने शेल में pipe() प्रणाली कॉल और पाइप और संस्करण 3 यूनिक्स में कई उपयोगिताओं को जोड़ा। मैक्लरॉय ने प्रारम्भ रखा, एक-लाइनर्स का अविस्मरणीय आर्गी देखा, क्योंकि प्लंबिंग के उत्साह में सम्मिलित हो गया। मैकिलॉय भी थॉम्पसन को इसका श्रेय देता है I | अंकन, जिसने संस्करण 4 यूनिक्स में पाइप सिंटैक्स के विवरण को बहुत सरल बना दिया।[8][7]

यद्यपि स्वतंत्र रूप से विकसित, यूनिक्स पाइप 1960 के दशक में डार्टमाउथ टाइम शेयरिंग प्रणाली के लिए केन लोचनर [9] द्वारा विकसित 'संचार फ़ाइलें' से संबंधित हैं, और उनसे पूर्व भी थे।[10] टोनी होरे की संचार अनुक्रमिक प्रक्रियाओं का संचार करना (सीएसपी) में मैकिलॉय के पाइपों को और अधिक विकसित किया गया है।[11] एप्पल कंप्यूटर स्वचालक (सॉफ्टवेयर) के आइकन में रोबोट, जो पुनरावृत्ति किये जाने वाले आदेशों को साथ में श्रृंखलाबद्ध करने के लिए पाइपलाइन अवधारणा का भी उपयोग करता है, मूल यूनिक्स अवधारणा के सम्मान में पाइप रखता है I

अन्य परिचालन सिस्टम

यूनिक्स की इस विशेषता को अन्य परिचालन प्रणाली, जैसे एमएस-डॉस और वीएम/सीएमएस और एमवीएस पर सीएमएस पाइपलाइन पैकेज द्वारा उधार लिया गया था, और अंततः सॉफ्टवेयर इंजीनियरिंग की पाइपलाइन (सॉफ्टवेयर) के रूप में नामित किया गया है।

यह भी देखें

  • प्रत्येक चीज़ फाइल है - यूनिक्स की परिभाषित विशेषताओं में से एक का वर्णन करता है; यूनिक्स अर्थ में पाइपलाइनें "फ़ाइलों" पर कार्य करती हैं I
  • अनाम पाइप - फीफो संरचना जिसका उपयोग अंतरप्रक्रिया संचार के लिए किया जाता है
  • जीस्ट्रीमर - पाइपलाइन आधारित मल्टीमीडिया ढांचा
  • सीएमएस पाइपलाइन
  • पुनरावृति
  • नामित पाइप - अंतरप्रक्रिया संचार के लिए उपयोग किए जाने वाले दृढ़ पाइप
  • प्रक्रिया प्रतिस्थापन - प्रक्रिया में कई पाइपों को जोड़ने के लिए शेल सिंटैक्स
  • जीएनयू समानांतर
  • पाइपलाइन (कंप्यूटिंग) - कंप्यूटर से संबंधित अन्य पाइपलाइन
  • पुनर्निर्देशन (कंप्यूटिंग)
  • टी (कमांड) - पाइपलाइन से डेटा टैप करने के लिए सामान्य कमांड
  • एक्सएमएल पाइपलाइन - एक्सएमएल फाइलों के प्रसंस्करण के लिए
  • ज़र्ग

संदर्भ

  1. Mahoney, Michael S. "The Unix Oral History Project: Release.0, The Beginning". McIlroy: It was one of the only places where I very nearly exerted managerial control over Unix, was pushing for those things, yes.
  2. "भविष्यवाणी पेट्रोग्लिफ्स". cm.bell-labs.com. Archived from the original on 8 May 1999. Retrieved 22 May 2022.
  3. "बैश रिलीज नोट्स". tiswww.case.edu. Retrieved 2017-06-14.
  4. "SSH के साथ शेल लूप इंटरेक्शन". 6 March 2012. Archived from the original on 6 March 2012.
  5. John1024. "मैं बैश में एक सरणी के रूप में "ढूंढें" कमांड परिणामों को कैसे संग्रहीत कर सकता हूं". Stack Overflow.
  6. "UNIX ऑपरेटिंग सिस्टम का निर्माण". Bell Labs. Archived from the original on September 14, 2004.
  7. 7.0 7.1 McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
  8. http://www.linfo.org/pipe.html Pipes: A Brief Introduction by The Linux Information Project (LINFO)
  9. http://www.cs.rit.edu/~swm/history/DTSS.doc[bare URL DOX/DOCX file]
  10. "आंकड़े". cm.bell-labs.com. Archived from the original on 20 February 1999. Retrieved 22 May 2022.
  11. https://swtch.com/~rsc/thread/ Bell Labs and CSP Threads (Russ Cox)


बाहरी संबंध