जवाबों:
&
कमांड के अंत में ट्रेलिंग ऑपरेटर का उपयोग कमांड को पृष्ठभूमि में रखने के लिए किया जाता है। यह वास्तव में POSIX मानक द्वारा निर्दिष्ट एक मानक वाक्यविन्यास है :
अतुल्यकालिक सूची
यदि नियंत्रण ऑपरेटर ('और') द्वारा एक कमांड को समाप्त किया जाता है, तो शेल कमांड को एक उप-प्रकार में एसिंक्रोनस रूप से निष्पादित करेगा। इसका मतलब है कि शेल अगले कमांड को निष्पादित करने से पहले कमांड के खत्म होने का इंतजार नहीं करेगा।
पृष्ठभूमि में कमांड चलाने का प्रारूप है:
कमांड 1 और [कमांड 2 और ...]
कमांडिंग को बैकग्राउंड करने का उद्देश्य स्क्रिप्ट के मुख्य शेल के बिना एक कमांड चलाना है या कमांड के लिए इंटरएक्टिव शेल है, जो अन्य कमांड के निष्पादन को अवरुद्ध करेगा और उपयोगकर्ता को प्रतीक्षा करने के लिए असुविधा करेगा। यह लंबे समय से चलने वाली कमांड शुरू करने के लिए आसान है, लेकिन आपको वर्तमान शेल में काम जारी रखने की आवश्यकता है। जैसा कि आप अनुमान लगा सकते हैं, यह उस समय से उत्पन्न हुआ था जहां कोई मल्टी-टैब टर्मिनल एमुलेटर नहीं थे, लेकिन टर्मिनल वास्तविक भौतिक हार्डवेयर थे जो कंप्यूटर से ही जुड़े थे।
परिभाषा से आप देख सकते हैं कि &
कमांड कमांडर के रूप में भी कमांड लिस्ट के लिए ;
काम करता है। आपके विशिष्ट उदाहरण pyprogramm >> /dev/null 2>&1 &
में, सूची में केवल एक कमांड है।
आम तौर पर,
echo Hello ; echo World ;
तथा
echo Hello & echo World &
ऑपरेटरों ;
और &
ऑपरेटरों द्वारा समाप्त सूचियों के दो उदाहरण हैं । एक अंतर यह है कि &
समाप्त सूची में इनपुट जुड़ा होगा /dev/null
यदि नौकरी नियंत्रण अक्षम है:
यदि नौकरी नियंत्रण अक्षम है (सेट देखें, -m), किसी भी स्पष्ट पुनर्निर्देशन से पहले अतुल्यकालिक सूची के लिए मानक इनपुट, एक ऐसी फ़ाइल को सौंपा जाना माना जाएगा जिसमें समान / dev / null के समान गुण हों। नौकरी नियंत्रण सक्षम होने पर ऐसा नहीं होगा। सभी मामलों में, मानक इनपुट का स्पष्ट पुनर्निर्देशन इस गतिविधि को ओवरराइड करेगा।
क्रमिक सूची में, हालांकि, प्रत्येक कमांड अभी भी stdin
टर्मिनल से जुड़ा हुआ है अगर कोई स्पष्ट पुनर्निर्देशन नहीं है।
यह भी ध्यान दें, कि हमने पहले बताई गई परिभाषा से, &
उप-क्रम में कमांड निष्पादित की है। इसके विपरीत, ;
समाप्त सूची को वर्तमान शेल में निष्पादित किया जाता है। बाहर निकलने की स्थिति में भी अंतर है। के लिए &
मानक का कहना है:
एक अतुल्यकालिक सूची की निकास स्थिति शून्य होगी।
यह महत्वपूर्ण है जब आप पृष्ठभूमि में कई कमांड रखना चाहते हैं। जब आप कोई स्क्रिप्ट या कमांड लिखते हैं, तो आपको उन कमांड्स को चुनना होगा, जिनके लिए आपको परवाह नहीं है कि वे असफल हुए या नहीं, या आपको गैर-शून्य (त्रुटि) निकास स्थिति को संभालने का कोई तरीका खोजना होगा। आपके विशिष्ट उदाहरण में, pyprogramm >> /dev/null 2>&1 &
पृष्ठभूमि में चलने का यह संकेत देने का कोई तरीका होना चाहिए कि क्या यह विफल हुआ या नहीं, हालांकि यह देखते हुए कि आप जो उपयोग 2>&1
करते हैं वह त्रुटि आउटपुट को पुनर्निर्देशित करके छिपा रहा है, और आप शायद मान लें कि स्क्रिप्ट विफल नहीं होनी चाहिए।
इसके विपरीत, ;
बाहर निकलने की स्थिति के रूप में परिभाषित किया गया है:
अनुक्रमिक सूची की निकास स्थिति सूची में अंतिम कमांड की निकास स्थिति होगी।
फिर, इसका यह अर्थ है कि आप कमांड-लाइन में कमांड की क्रमिक सूची कैसे लिखते हैं और आप चाहते हैं कि सूची में कुछ कमांड विफल होने पर चीजों को कैसे संभाला जाए।
तथ्य यह है कि इस POSIX परिभाषा का मतलब है कि सभी बॉर्न की तरह गोले, जिसका अर्थ है bash
, dash
और ksh
यह समर्थन करना चाहिए।
&
पुनर्निर्देशन &
में कमांड टर्मिनेटर के रूप में अलग है । इसका मतलब फ़ाइल-डिस्क्रिप्टर ऑब्जेक्ट को डुप्लिकेट करना (कॉपी करना) है। देखें कि आउटपुट रीडायरेक्शन में वास्तव में क्या होता है?
में bash
वहाँ भी |&
ऑपरेटर (पाइप और एम्परसेंड के बीच कोई अंतराल पर ध्यान दें)। से बैश मैनुअल :
यदि - & का उपयोग किया जाता है, तो कमांड का मानक त्रुटि, इसके मानक आउटपुट के अलावा, पाइप के माध्यम से कमांड 2 के मानक इनपुट से जुड़ा होता है; यह 2> और 1 के लिए आशुलिपि है। मानक आउटपुट के लिए मानक त्रुटि का यह अंतर्निहित पुनर्निर्देशन कमांड द्वारा निर्दिष्ट किसी भी पुनर्निर्देशन के बाद किया जाता है।
इसका मतलब है बैकग्राउंड में कमांड चलाना। कॉलिंग स्क्रिप्ट ब्लॉक होने के बजाय तब तक जारी रहती है जब तक कि कमांड पूरी न हो जाए।
&
छुपा उत्पादन के बारे में क्या कहते हैं सही नहीं लगता है। मानक से पैराग्राफ जिसे आप इनपुट के उद्धरण देते हैं , आउटपुट नहीं । नौकरी नियंत्रण के बीच अंतर करने में सक्षम होने या न होने का कारण यह है कि ट्टी से पढ़ने का प्रयास करने वाली पृष्ठभूमि प्रक्रिया निलंबित हो जाएगी। उस बिंदु पर आपको उस इनपुट को उपलब्ध कराने के लिए जॉब कंट्रोल का उपयोग करने की आवश्यकता होती है, जिस इनपुट का वह इंतजार कर रहा होता है। यह सब नौकरी के नियंत्रण के बिना नहीं किया जा सकता है और इस प्रकार यदि नौकरी नियंत्रण अक्षम हो जाता है, तो स्टड को पुनर्निर्देशित करने की आवश्यकता होती है/dev/null
।