बैश कैसे व्यवहार करता है ">> ()"


9

आउटपुट पुनर्निर्देशन और प्रक्रिया प्रतिस्थापन के साथ प्रयोग करते समय मैंने निम्नलिखित कमांड और इसके परिणामस्वरूप आउटपुट पर ठोकर खाई:

    me @ elem: ~ $ इको फू>> (बिल्ली); इको बार
    बार
    मुझे @ हाथी: ~ $ फू

(हां, अंत में वह खाली न्यूलाइन जानबूझकर है।)

तो इको बार को बैश करें, मेरी सामान्य प्रॉम्प्ट, इको की फू, एको की न्यूलाइन को प्रिंट करता है, और मेरे कर्सर को वहां छोड़ देता है। अगर मैं फिर से प्रवेश करता हूं, तो यह मेरे संकेत को एक नई लाइन पर प्रिंट करेगा और कर्सर को इसके बाद छोड़ देगा (जैसा कि किसी हिट कमांड लाइन पर दर्ज होने पर अपेक्षित है)।

मैं एक फ़ाइल डिस्क्रिप्टर के लिए फू लिखने की उम्मीद कर रहा था, बिल्ली इसे पढ़ती है और इको का फू, दूसरा इको इको बार, और फिर कमांड प्रॉम्प्ट पर वापस आ जाती है। लेकिन यह स्पष्ट रूप से ऐसा नहीं है।

क्या कोई समझा सकता है कि क्या चल रहा है?


मैं इस पर जवाब देखने का सुझाव देना चाहता हूं: unix.stackexchange.com/questions/182800/… यह दोहरा पुनर्निर्देशन बताता है, और यह बताएगा कि आप विभिन्न परिणामों के साथ क्यों समाप्त हो रहे हैं। मुरू और माइकल हॉर्मर्स दोनों।
नो टाइम

बोर्न अगेन शेल के कुछ संस्करणों में प्रॉम्प्ट प्रतिस्थापन का प्रॉम्प्ट (और कुछ परिस्थितियों में बिल्कुल भी प्रकट नहीं होता है) के बाद स्पष्ट रूप से निपटने के लिए स्पष्ट रूप से निपटने के लिए, unix.stackexchange.com/questions/471987 देखें ।
JdeBP

जवाबों:


9

आप समय fooसे पहले संकेत के बाद bar, बाद barमें या संकेत के बाद भी प्रदर्शित हो सकते हैं । लगातार समय प्राप्त करने के लिए थोड़ा विलंब जोड़ें:

$ echo foo > >(sleep 1; cat); echo bar; sleep 2 
bar
foo
$

barतुरंत दिखाई देता है, फिर fooएक सेकंड के बाद , फिर एक और सेकंड के बाद अगला संकेत।

क्या हो रहा है कि बैश पृष्ठभूमि में प्रक्रिया प्रतिस्थापन निष्पादित करता है।

  1. मुख्य बैश प्रक्रिया को निष्पादित करने के लिए एक उपखंड शुरू होता है sleep 1; cat, और इसे एक पाइप सेट करता है।
  2. मुख्य बैश प्रक्रिया निष्पादित होती है echo foo। चूंकि यह पाइप के बफर को नहीं भरता है, echoकमांड बिना ब्लॉक किए समाप्त हो जाता है।
  3. मुख्य बैश प्रक्रिया निष्पादित होती है echo bar
  4. मुख्य बैश प्रक्रिया ने कमांड को लॉन्च किया sleep 2
  5. इस बीच, सबस्क्रिप्शन कमांड लॉन्च कर रहा है sleep 1
  6. लगभग 1 सेकंड के बाद, sleep 1उपप्रकार में लौटता है। उपप्रकार निष्पादित करने के लिए आगे बढ़ता है cat
  7. cat इसके इनपुट को इसके आउटपुट (जो स्क्रीन पर प्रदर्शित होता है) और रिटर्न में कॉपी करता है।
  8. उपधारा ने अपना काम समाप्त कर दिया है, यह बाहर निकलता है।
  9. एक और सेकंड के बाद, sleep 2रिटर्न। मुख्य शेल प्रक्रिया निष्पादन को पूरा करती है और आपको अगला प्रॉम्प्ट देखने को मिलता है।

3

आपको उस प्रभाव को प्राप्त करने के लिए प्रक्रिया प्रतिस्थापन की आवश्यकता नहीं है। इसे इस्तेमाल करे:

( echo foo | cat & )

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

bashअगले प्रॉम्प्ट को प्रिंट करने से पहले बच्चे की प्रक्रिया जरूरी नहीं है । और जब से इसका आउटपुट बफ़र किया जाता है, तब तक यह कुछ भी आउटपुट नहीं करता है जब तक कि यह समाप्त न हो जाए। उस समय, बैश ने सिर्फ $stderr पर मुद्रित किया है, और अब पृष्ठभूमि की प्रक्रिया मुद्रण fooऔर एक नई रेखा से बाहर निकल जाती है ।

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