STDOUT और STDIN को जोड़ने से क्या मतलब है?


10

मैं एक किताब पढ़ रहा हूं, यह कहता है:

हर प्रक्रिया में कम से कम तीन संचार चैनल उपलब्ध हैं: "मानक इनपुट" (एसटीडीआईएन), "मानक आउटपुट" (एसटीडीयूएसटी), और "मानक त्रुटि" (एसटीडीआरआर)।

अधिकांश कमांड एसटीडीआईएन से उनके इनपुट को स्वीकार करते हैं और एसटीडीयूएसटी को अपना आउटपुट लिखते हैं। वे STDERR को त्रुटि संदेश लिखते हैं। यह कन्वेंशन आपको समग्र पाइपलाइन बनाने के लिए बिल्डिंग ब्लॉक्स की तरह एक साथ स्ट्रिंग कमांड देता है।

खोल प्रतीकों की व्याख्या <, >और >>निर्देश के रूप में करने के लिए या किसी फ़ाइल से कोई आदेश के इनपुट या आउटपुट मार्ग बदलने के लिए।

एक कमांड के STDOUT को दूसरे के STDIN से कनेक्ट करने के लिए, | प्रतीक का उपयोग करें , जिसे आमतौर पर एक पाइप के रूप में जाना जाता है।

ps -ef | grep httpd

तो मूल रूप से यह क्या कह रहा है कि मानक इनपुट एक कमांड है जो उपयोगकर्ता को फ़ाइल में लिखने की अनुमति देता है, जबकि मानक आउटपुट एक कमांड है जिसमें बैश शेल आउटपुट शेल में लिखते हैं, और मानक त्रुटि आउटपुट की तरह ही होती है लेकिन यह केवल है फ़ाइल सिस्टम में कोई त्रुटि होने पर आह्वान किया जाता है। तब हम STDOUT और STDIN को जोड़ने के हिस्से में पहुँच जाते हैं और मैं खो जाता हूँ।

जवाबों:


25

मानक इनपुट और मानक आउटपुट कमांड नहीं हैं।

एक विधानसभा लाइन के साथ कारखाने में मशीनों के रूप में कमांड की कल्पना करो। अधिकांश मशीनों को डेटा को खिलाने के लिए एक कन्वेयर बेल्ट और डेटा को फीड करने के लिए एक कन्वेयर बेल्ट होने के लिए डिज़ाइन किया गया है; वे क्रमशः मानक इनपुट और मानक आउटपुट हैं। मानक त्रुटि मशीन के किनारे पर एक उद्घाटन है जहां यह अस्वीकार कर सकता है।

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

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

यूनिक्स शब्दों में, इसे एक पाइपलाइन कहा जाता है । रूपक पाइपलाइन का है: एक पाइप मशीन A को मशीन B से जोड़ता है। ऊपर पाइपलाइन के लिए शेल सिंटैक्स है

<input-file.txt commandA | commandB >output-file.txt

< पुनर्निर्देशन प्रतीक खोल बताता है कनेक्ट करने के लिए commandAफाइल करने के लिए की मानक इनपुट input-file.txtशुरू करने से पहले commandA। (आप पुनर्निर्देशन को कमांड नाम से पहले या बाद में रख सकते हैं।) >पुनर्निर्देशन चिन्ह शेल को commandBमानक आउटपुट से कनेक्ट करने के लिए कहता है output-file.txt। पाइप (" |") प्रतीक बीच में शेल को लॉन्च करने से पहले commandAमानक आउटपुट को commandBमानक इनपुट से जोड़ने के लिए कहता है।

कमांड में एक से अधिक इनपुट और एक से अधिक आउटपुट हो सकते हैं, लेकिन यह एक और दिन के लिए सामग्री है


3
दृश्य ने बहुत मदद की
JohnMerlino

अच्छा सादृश्य। मैंने कई वर्षों से स्ट्रीम पाइपलाइन की अवधारणा को समझा है, लेकिन किसी ने कभी भी कारखाने / कन्वेयर सादृश्य का उपयोग नहीं किया है, जो वास्तव में आसानी से (और सहज रूप से) समझ में आता है। धन्यवाद!
ओवेन ब्लैकर

1
महान सादृश्य। अगर आपको कोई आपत्ति न हो तो यह उधार लेना।
टिवी

गाइल्स, मैंने नीचे आपके वाक्यांश पर एक प्रश्न पूछा है: unix.stackexchange.com/q/96724/29146 । क्या आप स्पष्ट कर सकते हैं?
स्ट्रगलर

@Gilles - क्या आप एक उदाहरण शामिल कर सकते हैं जो आदेश से पहले या बाद में पुनर्निर्देशन को परिभाषित करने के विकल्प को दर्शाता है? उदाहरण के लिए, क्या पाइप लाइन इनपुट-फाइल के रूप में पढ़ सकती है। टेक्स्ट> कमांड या इनपुट- फाइल। टेक्सट <कमांड?
प्रेरित

6

standard input is a command that allows user to write to a file

आज्ञा नहीं, बल्कि एक धारा। अंदर और बाहर मानक मेल बॉक्स की तरह हैं। जब कोई प्रोग्राम शुरू होता है, तो उसे एक बॉक्स दिया जाता है और मेल भेजने के लिए एक बॉक्स दिया जाता है। आमतौर पर, इनपुट कीबोर्ड से आता है और इसे इन-बॉक्स में डाल दिया जाता है, आउट-बॉक्स में डाला गया मेल आपकी टर्मिनल स्क्रीन पर समाप्त होता है।

standard output is a command that has the bash shell write output to the shell

कार्यक्रम वास्तव में मानक बिंदुओं को नहीं जानता है। जब आप A से B (as $ A | B) को पाइप करते हैं , जब A आउट-बॉक्स में मेल डालता है, तो वह B के इन-बॉक्स में समाप्त हो जाता है। बी इनपुट की प्रक्रिया करता है और आउट-बॉक्स में अपना मेल डालता है, जिसे आप टर्मिनल पर देखते हैं।

रूपक को गिराने के लिए, जैसा कि उल्लेख किया गया है, मानक / बाहर धाराएँ हैं। मेल बॉक्स, या फ़ाइल डिस्क्रिप्टर , स्ट्रीम का एक छोर है। पाइप को A से मानक B को मानक से जोड़ना है।

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