जवाबों:
$(…)
परिभाषा के अनुसार एक उपधारा है: यह शेल रनटाइम स्थिति की एक प्रति है, और उपधारा में बने राज्य में परिवर्तन का माता-पिता पर कोई प्रभाव नहीं पड़ता है। एक subshell आम तौर द्वारा कार्यान्वित किया जाता forking एक नई प्रक्रिया (लेकिन कुछ गोले कुछ मामलों में इस का अनुकूलन कर सकते हैं)।
यह एक उपधारा नहीं है जिससे आप चर मान प्राप्त कर सकते हैं। यदि चर में परिवर्तन का माता-पिता पर प्रभाव पड़ता है, तो यह एक उपधारा नहीं होगा। यह एक सबमिशन है जिसका आउटपुट माता-पिता पुनः प्राप्त कर सकते हैं। इसके द्वारा बनाई गई उपधारा में $(…)
मानक मानक एक पाइप पर सेट है, और अभिभावक उस पाइप से पढ़ता है और आउटपुट एकत्र करता है।
कई अन्य निर्माण हैं जो एक उपधारा बनाते हैं। मुझे लगता है कि यह मारपीट की पूरी सूची है:
( … )
कुछ नहीं करता है, लेकिन एक subshell बनाने और इसे समाप्त करने के लिए के लिए प्रतीक्षा)। इसके विपरीत { … }
जो समूह वाक्यात्मक उद्देश्यों के लिए विशुद्ध रूप से आदेश देते हैं और एक उपधारा नहीं बनाते हैं।… &
एक सबस्क्रिप्शन बनाता है और इसे समाप्त करने के लिए इंतजार नहीं करता है।… | …
दो उपधाराएं बनाता है, एक बाएं हाथ की ओर और एक दाएं हाथ की ओर के लिए, और दोनों को समाप्त करने के लिए इंतजार करता है। शेल एक पाइप बनाता है और बाएं हाथ की ओर के मानक आउटपुट को पाइप के राइट एंड और राइट-हैंड साइड के स्टैंडर्ड इनपुट को रीड एंड से जोड़ता है। कुछ गोले में (ksh88, ksh93, zsh, lastpipe
विकल्प सेट और प्रभावी के साथ बैश ), दायाँ हाथ मूल शेल में चलता है, इसलिए पाइपलाइन का निर्माण केवल एक उपधारा बनाता है।$(…)
(यह भी वर्तनी `…`
) एक मानक सेट के साथ एक पाइप के लिए एक उपखंड बनाता है, माता-पिता में आउटपुट एकत्र करता है और उस आउटपुट में फैलता है, इसकी अनुगामी नईलाइन्स को घटाता है। (और आउटपुट आगे बंटवारे और ग्लोबिंग के अधीन हो सकता है, लेकिन यह एक और कहानी है।)<(…)
एक पाइप के लिए सेट अपने मानक उत्पादन के साथ एक उपखंड बनाता है और पाइप के नाम तक फैलता है। माता-पिता (या कुछ अन्य प्रक्रिया) उपधारा के साथ संवाद करने के लिए पाइप खोल सकते हैं। >(…)
मानक इनपुट पर पाइप के साथ भी ऐसा ही है।coproc …
एक सबस्क्रिप्शन बनाता है और इसके समाप्त होने का इंतजार नहीं करता है। सबशेल के मानक इनपुट और आउटपुट प्रत्येक पाइप के लिए सेट होते हैं, जिसमें पैरेंट प्रत्येक पाइप के दूसरे छोर से जुड़ा होता है।${...}
उत्तर में भी शामिल हो सकते हैं ?
command | { read line; … }
(शेल के आधार पर, line
पाइपलाइन के बाद भी उपलब्ध हो सकता है या नहीं भी हो सकता है)। सभी तरीकों में एक सबशेल शामिल होता है क्योंकि आउटपुट उत्पन्न करने वाली कमांड को इनपुट पढ़ने वाले शेल से स्वतंत्र रूप से चलना होता है। यदि कमांड पूरी तरह से शेल में आंतरिक है (केवल शेल कंस्ट्रक्शंस और बिल्डिन्स, नो एक्सटर्नल कमांड्स), शेल शायद एक सबप्रोसेस नहीं बना सकता है, लेकिन यह सिर्फ एक ऑप्टिमाइज़ेशन है, यह अभी भी सबस्क्रिप्शन बनाता है।
Bash संस्करण 4.4 में bash (1) मैन पेज से, "EXPANSION" अनुभाग, "कमांड सब्स्टीट्यूशन" उपधारा:
बैश
command
एक उप- परिवेश में निष्पादित करके विस्तार करता है [...]
bash
मैनपेज में कोई सबस्क्रिप्शन नहीं है: Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.
मुझे आश्चर्य है कि अगर यह एक जानबूझकर चूक थी।