मूल शेल प्रक्रिया की लगभग समान प्रतिलिपि के रूप में एक सबशेल शुरू होता है। हुड के तहत, शेल fork
सिस्टम कॉल 1 को कॉल करता है , जो एक नई प्रक्रिया बनाता है जिसका कोड और मेमोरी 2 प्रतियां हैं । जब उप-संस्करण बनाया जाता है, तो इसके और इसके माता-पिता के बीच बहुत कम अंतर होते हैं। विशेष रूप से, उनके पास एक ही चर हैं। यहां तक कि $$
विशेष चर उप मानों में समान मूल्य रखता है: यह मूल शेल की प्रक्रिया आईडी है। इसी तरह $PPID
मूल खोल के माता-पिता का पीआईडी है।
कुछ गोले उप-प्रकार में कुछ चर बदलते हैं। बैश BASHPID
शेल प्रक्रिया के पीआईडी पर सेट हो जाता है, जो उप-श्रेणियों में बदल जाता है। बैश, zsh और mksh $RANDOM
माता पिता और उपधारा में विभिन्न मूल्यों की उपज के लिए व्यवस्था करते हैं । लेकिन इन जैसे विशेष मामलों में अंतर्निहित के अलावा, सभी चर का मूल शेल में समान मान है, समान निर्यात स्थिति, समान रीड-ओनली स्थिति, आदि सभी फ़ंक्शन परिभाषाएँ, अन्य नाम परिभाषाएँ, शैल विकल्प और अन्य सेटिंग्स भी विरासत में मिली हैं।
इसके द्वारा बनाई गई उपधारा (…)
में इसके निर्माता के रूप में एक ही फ़ाइल वर्णनकर्ता है। उपधारा बनाने के कुछ अन्य साधन उपयोगकर्ता कोड को निष्पादित करने से पहले कुछ फ़ाइल विवरणों को संशोधित करते हैं; उदाहरण के लिए, पाइप का बायाँ भाग, उप-भाग 3 में चलता है, जो पाइप से जुड़े मानक आउटपुट के साथ है। उपधारा भी एक ही वर्तमान निर्देशिका, एक ही संकेत मुखौटा, आदि के साथ शुरू होता है। कुछ अपवादों में से एक यह है कि उपधाराएँ कस्टम जाल को प्राप्त नहीं करती हैं: उपेक्षित संकेतों ( ) को उपधारा में अनदेखा किया जाता है, लेकिन अन्य जाल ( संकेत ) रीसेट हो जाते हैं डिफ़ॉल्ट कार्रवाई के लिए 4 ।trap '' SIGNAL
trap CODE
एक उपधारा इस प्रकार एक स्क्रिप्ट को निष्पादित करने से अलग है। एक स्क्रिप्ट एक अलग कार्यक्रम है। यह अलग-अलग कार्यक्रम संयोग से एक स्क्रिप्ट भी हो सकता है जिसे माता-पिता के समान दुभाषिया द्वारा निष्पादित किया जाता है, लेकिन यह संयोग अलग कार्यक्रम को माता-पिता के आंतरिक डेटा पर कोई विशेष दृश्यता नहीं देता है। गैर-निर्यात किए गए चर आंतरिक डेटा होते हैं, इसलिए जब चाइल्ड शेल स्क्रिप्ट के लिए दुभाषिया निष्पादित किया जाता है , तो यह इन चर को नहीं देखता है। निर्यात किए गए चर, यानी पर्यावरण चर, निष्पादित कार्यक्रमों में प्रेषित किए जाते हैं।
इस प्रकार:
x=1
(echo $x)
प्रिंट करता है, 1
क्योंकि उपधारा उस खोल की प्रतिकृति है जिसने इसे बनाया है।
x=1
sh -c 'echo $x'
एक शेल के एक बच्चे की प्रक्रिया के रूप में एक शेल को चलाने के लिए होता है, लेकिन x
दूसरी लाइन पर दूसरी लाइन के साथ अधिक कनेक्शन नहीं x
होता है
x=1
perl -le 'print $x'
या
x=1
python -c 'print x'
1 एक अपवाद ksh93
शेल है जहां फोर्किंग को अनुकूलित किया गया है और इसके अधिकांश साइड इफेक्ट का अनुकरण किया गया है।
2 शब्दार्थ, वे प्रतियां हैं। कार्यान्वयन के दृष्टिकोण से, बहुत कुछ साझा हो रहा है।
3 दाहिने हाथ की ओर, यह शेल पर निर्भर करता है।
4 यदि आप इसका परीक्षण करते हैं, तो ध्यान दें कि जैसी चीजें$(trap)
मूल शेल के जाल की रिपोर्ट कर सकती हैं। यह भी ध्यान दें कि कई खोलों में जाल वाले मामलों में कोने के कीड़े हैं। उदाहरण के लिए निंजाल नोटों का कहना है कि 4.3 के रूप में, "दो उपधारा" मामले में नेस्टेड सब-ट्रैल से जाल bash -x -c 'trap "echo ERR at \$BASH_SUBSHELL \$BASHPID" ERR; set -E; false; echo one subshell; (false); echo two subshells; ( (false) )'
चलाता है ERR
, लेकिन ERR
मध्यवर्ती उपधारा से जाल नहीं - set -E
विकल्प को प्रचारित करना चाहिएERR
सभी उपधाराओं के लिए जाल लेकिन मध्यवर्ती उपधारा दूर अनुकूलित है और इसलिए इसके ERR
जाल को चलाने के लिए नहीं है ।
x=out; (x=in; echo $x)
)