Linux/Bash शेल में तीन डेटा स्ट्रीम हैं जिनका उपयोग आप कमांड निष्पादित करते समय कर सकते हैं – stdin, stdout, और stderr। यहां बताया गया है कि उनका उपयोग कैसे करें।
stdin, stdout, stderr कंसोल में टेक्स्ट के प्रदर्शन की अनुमति देते हैं, और प्रत्येक स्ट्रीम से आउटपुट होने वाले डेटा को अन्य प्रोग्राम में निर्देशित किया जा सकता है।
इन्हें स्टैंडर्ड स्ट्रीम कहा जाता है।
stdin (स्टैंडर्ड इनपुट) क्या है?
टेक्स्ट इनपुट स्ट्रीम।
एप्लिकेशन stdin के माध्यम से टेक्स्ट को इनपुट के रूप में स्वीकार कर सकते हैं।
stdout (स्टैंडर्ड आउटपुट) क्या है?
एक प्रोग्राम का टेक्स्ट आउटपुट स्ट्रीम।
एप्लिकेशन stdout के माध्यम से अन्य प्रोग्राम (या देखने के लिए कंसोल) को डेटा भेजते हैं।
stderr (स्टैंडर्ड एरर) क्या है?
एक प्रोग्राम का टेक्स्ट एरर आउटपुट स्ट्रीम।
यदि कोई प्रोग्राम त्रुटि का सामना करता है, तो उसे त्रुटि के संबंध में डेटा को stdout स्ट्रीम के माध्यम से भेजना चाहिए।
…हाँ, लेकिन इसका वास्तव में क्या मतलब है?
एक कंप्यूटर प्रोग्राम इनपुट और आउटपुट डेटा के साथ चीजें करता है – उदाहरण के लिए, एक प्रोग्राम एक गणितीय समीकरण स्वीकार कर सकता है और उसका समाधान प्रदान कर सकता है।
आपको समीकरण को प्रोग्राम में IN लाने का एक तरीका चाहिए और उत्तर को प्रोग्राम से OUT लाने का एक तरीका चाहिए। आप यह भी जानना चाहते हैं कि समीकरण हल करने योग्य नहीं था, इसलिए आप किसी भी अन्य आउटपुट से अलग उत्पन्न ERROR देखना चाहते हैं।
यही stdin, stdout, और stderr हैं।
क्योंकि सब कुछ एक ही तरह से काम करने से जीवन आसान हो जाता है, इन इनपुट, आउटपुट, और त्रुटि स्ट्रीम को मानकीकृत किया गया है ताकि कमांड लाइन के लिए बनाए गए एप्लिकेशन सभी एक ही तरह से व्यवहार करें।
इसलिए, स्टैंडर्ड स्ट्रीम। प्रत्येक स्ट्रीम का 0-3 से एक संख्यात्मक पहचानकर्ता होता है:
| 0 | stdin |
| 1 | stdout |
| 2 | stderr |
Bash/Shell में stdin, stdout, stderr से रीडायरेक्ट/पाइप करना
आप Linux शेल में टाइप करना टेक्स्ट की एक स्ट्रीम है – आप टाइप करते हैं, और टेक्स्ट स्ट्रीम कंसोल इनपुट में फीड की जाती है।
एक एप्लिकेशन चलता है, और उससे आउटपुट टेक्स्ट डेटा कंसोल में प्रदर्शन के लिए फीड किया जाता है ताकि आप इसे पढ़ सकें।
यह कंसोल पर काम करते समय सभी डिफ़ॉल्ट व्यवहार है, लेकिन इसे बदला जा सकता है। स्ट्रीम को रीडायरेक्ट किया जा सकता है – उदाहरण के लिए, प्रोग्राम का आउटपुट कंसोल पर देखने के बजाय सीधे फ़ाइल में स्ट्रीम किया जा सकता है।
एक प्रोग्राम का आउटपुट सीधे दूसरे प्रोग्राम के इनपुट में रीडायरेक्ट किया जा सकता है।
यहां रीडायरेक्शन और पाइपिंग का उपयोग करने वाले कुछ बुनियादी उदाहरण दिए गए हैं।
रीडायरेक्शन
आमतौर पर, echo कमांड टेक्स्ट को कंसोल पर प्रिंट करेगा:
echo "hello there!"
stdout echo प्रोग्राम का डिफ़ॉल्ट पथ ले रहा है जिसे आपकी स्क्रीन पर प्रदर्शित किया जाता है।
रीडायरेक्शन आपको इसे कहीं और भेजने देता है। यहां, इसे एक फ़ाइल में भेजा जाता है:
echo "hello there!" > test.txt
text.txt नामक एक फ़ाइल बनाई जाएगी जिसमें टेक्स्ट "hello there!" होगा (सावधान रहें, यदि फ़ाइल पहले से मौजूद है, तो यह ओवरराइट हो जाएगी)।
आप >> का उपयोग करके फ़ाइलों में जोड़ सकते हैं बजाय > के
अब, आइए < का उपयोग करके stdin रीडायरेक्ट करें
cat < test.txt
cat कमांड text.txt की सामग्री को अपने stdin स्ट्रीम में पढ़ता है और फिर वही करता है जो cat कमांड करने के लिए डिज़ाइन किया गया है – stdout पर सप्लाई किए गए डेटा को प्रिंट करता है, जो डिफ़ॉल्ट रूप से देखने के लिए कंसोल है। तो, यह बस hello there! को कंसोल पर आउटपुट करेगा।
फ़ाइल में डेटा cat कमांड के लिए stdin पर निर्देशित किया गया था – इसे रीडायरेक्ट किया गया था।
यह एक तरह की धोखाधड़ी है, cat कमांड पैरामीटर के रूप में पास किए गए फ़ाइलनाम से पढ़ने का प्रयास करेगा बिना पाइपिंग के, लेकिन यह इस उदाहरण के उद्देश्यों के लिए सबसे सरल कमांड है।
आप उसी कमांड में stdin और stdout को रीडायरेक्ट कर सकते हैं:
cat < test.txt > output.txt
stdin रीडायरेक्ट किया जा रहा है, test.txt को cat प्रोग्राम में पढ़ रहा है, और cat प्रोग्राम से stdout को output.txt नामक फ़ाइल में निर्देशित किया जा रहा है।
फिर से, यह धोखा है क्योंकि यह वास्तव में केवल फ़ाइल कॉपी करने के लिए cat कमांड का उपयोग कर रहा है, लेकिन यह एक सरल उदाहरण है जो अन्य कमांड की व्याख्या पर निर्भर नहीं करता है।
अंत में, आप उस विशिष्ट स्ट्रीम नंबर को निर्दिष्ट करके stderr स्ट्रीम को रीडायरेक्ट कर सकते हैं जिसे हम पढ़ना चाहते हैं (चूंकि stdout डिफ़ॉल्ट है, इसे निर्दिष्ट करने की आवश्यकता नहीं है):
cat nofile.txt 2> error.txt
stdout की पहचान नंबर 2 से की जाती है – यदि cat त्रुटि उत्पन्न करता है, तो इसे इस स्ट्रीम के माध्यम से भेजा जाएगा और फ़ाइल error.txt में जाएगा।
उपरोक्त उदाहरण error.txt नामक एक फ़ाइल बनाएगा जिसमें टेक्स्ट होगा:
cat: nofile.txt: No such file or directory
…क्योंकि cat कमांड nofile.txt फ़ाइल नहीं ढूंढ सका।
एक साथ रीडायरेक्शन
उपरोक्त उदाहरण में, stderr स्ट्रीम की पहचान उसके संख्यात्मक पहचानकर्ता द्वारा की गई थी – इसका मतलब है कि आप एक ही कमांड में stdout और stderr को रीडायरेक्ट कर सकते हैं यह निर्दिष्ट करके कि आप किसे रीडायरेक्ट करना चाहते हैं:
echo "hello there! 1>test.txt 2>error.txt
ऊपर, stdout test.txt को भेजा जाता है, और stderr error.txt को भेजा जाता है।
पाइपिंग
पाइपिंग रीडायरेक्शन के समान है, लेकिन यह केवल stdin और stdout से संबंधित है, त्रुटियों को अनदेखा किया जाता है।
echo "hello there!" | cat
यहां, पाइप (|) echo कमांड के stdout को cat कमांड के stdin पर पाइप (रीडायरेक्ट) करता है।
निष्कर्ष
कमांड-लाइन एप्लिकेशन के साथ काम करना शुरू में अनजाना लग सकता है, लेकिन वे कार्यों को स्वचालित करते समय शक्तिशाली टूल हैं। stdin, stdout, और stderr – स्टैंडर्ड स्ट्रीम इस लचीलेपन की आधारशिला हैं – आप जटिल वर्कफ़्लो बनाने के लिए कमांड को एक साथ जोड़ सकते हैं जो लगभग किसी भी कार्य को संभाल सकते हैं।