एक पाइप या पाइपई वास्तव में UNIX / Linux के लिए उपलब्ध एक पाइपलाइन है और बहुत ही व्यावहारिक है। लेकिन पूरी तरह से समझने के लिए कि एक पाइप क्या है, आपको पता होना चाहिए कि * निक्स पर्यावरण में 3 अंतर्निहित डेटा स्ट्रीम हैं। वह, जो नहीं जानते हैं, उनके लिए इसका मतलब है कि डेटा तीन बिंदुओं से या उससे यात्रा कर सकता है।
तब आप इसे बेहतर तरीके से समझ पाएंगे, लेकिन अब जो मैं आपको स्पष्ट करना चाहता हूं, वह यह है कि एक पाइपलाइन के साथ आप जो कर सकते हैं, वह उन बिंदुओं में से एक से दूसरे में चैनल है। यह आउटपुट या परिणाम को ले जाने की अनुमति देता है जो एक प्रोग्राम दूसरे के इनपुट की ओर फेंकता है ताकि वह इसका उपयोग करे, आदि। मैं इसे कुछ व्यावहारिक उदाहरणों के साथ समझाने की कोशिश करूंगा जो आपको इसे अच्छी तरह से समझने में मदद करेंगे।
मैं उन बिंदुओं के बारे में बात कर रहा था या डेटा स्ट्रीम, हैं:
- stdin: 0 से मेल खाती है और मानक इनपुट है। आम तौर पर, एक * निक्स सिस्टम के लिए मानक इनपुट कीबोर्ड है। यही है, आप जो टाइप करते हैं वह उपयोग की जाने वाली जानकारी होगी। उसके साथ एक विशेष उपकरण जुड़ा हुआ है जो / देव / स्टडिन है।
- stdout: 1 से पहचाना जाता है, यह मानक आउटपुट है। आमतौर पर यह आपके कंप्यूटर के मॉनिटर या स्क्रीन से मेल खाता है, जहाँ आप जानकारी देख सकते हैं। उदाहरण के लिए, जब आप एक ls कमांड चलाते हैं, तो सामग्री की सूची स्क्रीन पर दिखाई देगी, है ना? संबंधित उपकरण / dev / stdout है।
- stderr: 2 से पहचाना जाता है, यह मानक त्रुटि आउटपुट है, जब किसी प्रोग्राम में कोई त्रुटि होती है। संबंधित उपकरण / देव / stderr है।
एक पाइपलाइन के साथ आप मानक आउटपुट या एक कमांड पास को सीधे दूसरे के मानक इनपुट पर भेज सकते हैं। यही है, आप एक प्रोग्राम को दूसरे को खिला सकते हैं। कीबोर्ड द्वारा दर्ज किए गए मापदंडों का उपयोग करने के बजाय, एक पाइप पिछली कमांड द्वारा उत्पन्न जानकारी को इस पाइपलाइन के माध्यम से प्रस्तुत करता है, जिसका प्रतिनिधित्व |
साथ उदाहरण आप इसे बेहतर समझेंगे। मान लीजिए कि आप किसी निर्देशिका की सामग्री को सूचीबद्ध करना चाहते हैं, लेकिन आप केवल उन नामों को देखने में रुचि रखते हैं जो शब्द डॉक्टर से मेल खाते हैं। तो आप grep फ़िल्टर के इनपुट में ls के आउटपुट को पाइप करने के लिए एक पाइपलाइन का उपयोग कर सकते हैं, यह बताने के लिए कि यह उस पैटर्न से मेल खाने वाले लोगों को ही प्रदर्शित करता है:
ls -l | grep doc
इसलिए आपको सभी नाम दिखाने के बजाय, यह आपको दिखाता है जो वास्तव में आपकी रुचि रखते हैं। आप फ़ाइल की सामग्री के साथ भी ऐसा कर सकते हैं। कल्पना कीजिए कि आप केवल फ़ायरफ़ॉक्स नाम की प्रक्रियाओं की जानकारी देखना चाहते हैं और सभी नहीं:
ps aux | grep firefox
स्क्रीन पर पीएस प्रोग्राम के सभी आउटपुट (स्टडआउट) दिखाने के बजाय, यह क्या करता है यह grep फ़िल्टर के इनपुट के लिए चैनल है और आउटपुट में केवल दिखाता है कि इस मामले में फ़ायरफ़ॉक्स पैटर्न से मेल खाती है ...
आप चाहें तो उपयोग कर सकते हैं विभिन्न पाइप एक कमांड के आउटपुट को दूसरे दूसरे कमांड के इनपुट पर लाने के लिए, और दूसरे के आउटपुट को तीसरे के इनपुट पर लाने के लिए और इसी तरह। उदाहरण के लिए:
cat libro | grep love | more
जैसा कि आप देख रहे हैं संभावनाएं कई हैं, आप कल्पना कर सकते हैं और अनुमति दी जाती है। यहां तक कि किसी फ़ाइल की केवल पहली और अंतिम पंक्तियों को दिखाने के लिए, उन पंक्तियों की गणना करें जो सूची से आने वाले wc में दर्ज होती हैं, और यहां तक कि उन्हें क्रमबद्ध भी करती हैं:
cat listado | head cat listado | tail cat listado | wc -l cat listado | sort
साथ काम भी कर सकते हैं त्रुटियों के साथ | & और उदाहरण के लिए अगर यह विफल होता है तो स्क्रिप्ट के आउटपुट में शब्द चेतावनी की तलाश करें:
./miscript |& grep alerta
और अंत में, दो कमांड्स हैं जो पाइप से जुड़े हुए हैं टी और xargs और वे इन की संभावनाओं को और बढ़ा सकते हैं। टी के मामले में, यह जो अनुमति देगा वह मानक आउटपुट पर पिछले कार्यक्रम का परिणाम दिखाने के लिए है ताकि आप इसे देख सकें, और इसके अलावा, यह इसे किसी अन्य फ़ाइल में पाइप कर सकता है। एक उदाहरण यह होगा कि क्या आप किसी निर्देशिका की सामग्री को सूचीबद्ध करते हैं और इस समय ls -l का आउटपुट देखना चाहते हैं और यह भी फ़ाइल लिस्टिंग में सहेजा है।
ls -l | tee listado.txt
यदि आप टी का उपयोग नहीं करते हैं, तो आप अपने कंसोल पर आउटपुट नहीं देख पाएंगे ...
Y xargs यह कुछ मामलों में और भी दिलचस्प है। इस मामले में यह पाइप लाइन के माध्यम से प्राप्त होने वाले मानक इनपुट से एक कमांड बनाने में सक्षम है। दूसरे शब्दों में, यह सब कुछ कैप्चर करने में सक्षम है जो पिछले प्रोग्राम ने अपने आउटपुट के माध्यम से लॉन्च किया है और जो कि पाइपलाइन के माध्यम से xargs तक पहुंचता है, इसे तर्क के रूप में किसी अन्य कमांड में बदले।
अभी भी नहीं मिलता है? आप इसे एक उदाहरण के साथ बहुत बेहतर देखेंगे। कल्पना कीजिए कि आप एक निर्देशिका, डिस्क, या विभाजन से सभी लानत thumbs.db फ़ाइलों को निकालना चाहते हैं। यदि कई हैं, तो उन्हें मैन्युअल रूप से हटाने के लिए rm कमांड के साथ एक-एक करके जाना असंभव हो सकता है। लेकिन xargs से आप सब कुछ ऑटोमेट कर सकते हैं। और आप इसे खोजने के लिए खोज का उपयोग करके कर सकते हैं, आउटपुट को xargs के इनपुट के माध्यम से भेज सकते हैं और यह बदले में rm को तर्कों के रूप में नाम देगा। इसलिए, सभी स्थितियाँ स्वचालित रूप से हटा दी जाएंगी:
find ./ -name "thumbs.db" | xargs rm
उदाहरण के लिए, मान लें कि पता लगाएँ /home/name/thumbs.db, /media/test/thumbs.db, और /tmp/thumbs.db। खैर, xargs उन्हें rm को वितरित करने जा रहा है जैसे कि वे तर्क थे। यही है, जैसे कि हमने निष्पादित किया था: rm /home/name/thumbs.db, फिर rm /media/test/thumbs.db और फिर rm /tmp/thumbs.db।
उत्कृष्ट, यह जानकारी हमारे लिए लिनक्स उपयोगकर्ताओं के लिए बहुत महत्वपूर्ण है
क्या अच्छा लेख है, अभी मैं आई / ओ रीडायरेक्शन का अध्ययन लिनक्स कमांड लाइन पुस्तक में कर रहा हूं। यह मेरे लिए पाइप (पाइपलाइन) और तीन डेटा धाराओं के बारे में स्पष्ट है। योगदान की सराहना की है। अभिवादन।
Xargs के साथ उदाहरण ने मुझे एक दस्ताने की तरह अनुकूल किया। वास्तव में आज मैं एक विस्तार से काम कर रहा था जो कि मुझे "भागों में" भेजना था। xargs एक पिंटुरिटा चला गया।
सुपर आभारी!