एक सब-शेल एक बाल-शेल के समान है


11

यह दो नाम हैं: एक उपधारा और एक बच्चा-खोल

हां, इसमें से किसी के द्वारा एक बाल प्रक्रिया शुरू की जाएगी:

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat

क्या सभी समान हैं और समान नाम साझा करते हैं? क्या सभी समान गुण साझा करते हैं?


POSIX की यह परिभाषा है :

शेल निष्पादन वातावरण में शामिल हैं ...।

लेकिन उपरोक्त लिंक के अंतिम पैराग्राफ में यह है:

शेल वातावरण की एक उपधारा वातावरण बनाया जाएगा, सिवाय इसके कि सिग्नल ट्रैप्स जिन्हें नजरअंदाज नहीं किया जा रहा है उन्हें डिफ़ॉल्ट कार्रवाई पर सेट किया जाएगा।

और विशेष रूप से:

कमांड प्रतिस्थापन, कमांड जो कोष्ठक के साथ समूहीकृत किए जाते हैं, और अतुल्यकालिक सूची को एक उप-वातावरण में निष्पादित किया जाएगा। इसके अतिरिक्त, बहु-कमान पाइपलाइन की प्रत्येक कमांड एक उप-वातावरण में है; ....

sh -c 'echo "Hello"', वहाँ शामिल नहीं है कि यह भी एक subshell बुलाया जाना चाहिए?

जवाबों:


14

एक सबस्क्रिप्शन मौजूदा शेल को डुप्लिकेट करता है। यह एक ही चर है, एक ही कार्य, एक ही विकल्प, आदि। हुड के तहत, forkसिस्टम कॉल system के साथ एक उपधारा बनाया जाता है ; बच्चे की प्रक्रिया वही करती है जो उससे अपेक्षित होती है जबकि अभिभावक प्रतीक्षा करता है (जैसे, $(…)) या अपने जीवन (जैसे, … &) के साथ आगे बढ़ता है या अन्यथा वही करता है जो उससे अपेक्षित है (जैसे, … | …)।

sh -c …एक उपधारा नहीं बनाता है। यह एक और कार्यक्रम शुरू करता है। यह कार्यक्रम एक शेल होने के लिए होता है, लेकिन यह सिर्फ एक संयोग है। कार्यक्रम एक अलग शेल भी हो सकता है (उदाहरण के लिए, यदि आप sh -c …बैश से चलते हैं , और shडैश हैं), अर्थात, एक पूरी तरह से अलग प्रोग्राम जो बस होता है उसके व्यवहार में महत्वपूर्ण समानताएं होती हैं। हुड के तहत, एक बाहरी कमांड ( shया किसी अन्य) को लॉन्च करना forkसिस्टम कॉल को कॉल करता है और फिर execveसिस्टम प्रोग्राम को सबप्रोसेस में शेल प्रोग्राम को दूसरे प्रोग्राम (यहां ) से बदलने के लिए कहता है sh

¹ शामिल है $$, लेकिन कुछ खोल-विशिष्ट चर जैसे बैश और मक्स के को छोड़कर BASHPID
That 's कम से कम, यह पारंपरिक और सामान्य कार्यान्वयन है। यदि वे अन्यथा व्यवहार की नकल कर सकते हैं तो गोले दूर कांटे का अनुकूलन कर सकते हैं।

प्रासंगिक मानव पृष्ठ: कांटा (2) , निष्पादित (2)


धन्यवाद। बैश शबंग के साथ बैश स्क्रिप्ट चलाने से क्या ताल्लुक है?
टिम

@ यह उसी तरह की बात है sh -c: यह एक उपप्रकार है जो संयोग से एक शेल होता है।
गिल्स एसओ- बुराई को रोकें '

(1) "एक बाहरी कमांड (श या किसी अन्य) को लॉन्च करना फोर्क सिस्टम कॉल को कॉल करता है और फिर सबप्रोसेस में शेल प्रोग्राम को दूसरे प्रोग्राम (यहां श) द्वारा बदलने के लिए सिस्टम कॉल निष्पादित करता है।" क्या यह सही है कि कांटा पहले एक उपखंड बनाता है और फिर बाह्य कार्यक्रम के साथ उपधारा को प्रतिस्थापित करता है? तो आपके जवाब में दो मामलों में, हमेशा एक उपधारा बनाया जाता है? (2) "एक उपधारा जो मौजूदा शेल की नकल करती है।" इसका क्या मतलब है?
टिम

(3) में bash -c <command>, फोर्क के बाद शेल और फिर निष्पादित करें bash -c <command>, एक बैश शेल बनाया जाता है। फिर सिस्टम कॉल का उपयोग <command>फिर से बैश शेल को फोर्क करने और निष्पादित करने के लिए किया जाता है <command>?
टिम

2
@ क्यूंग्लम "चाइल्ड शेल" एक विशिष्ट अर्थ के साथ एक तकनीकी शब्द नहीं है, जो "उपधारा" के विपरीत है। यदि यह एक खोल है जो एक बच्चा है, तो यह अंग्रेजी के सामान्य नियमों का पालन करते हुए एक बच्चा खोल है।
गिलेस एसओ- बुराई को रोकना '

1

एक उप-शेल वातावरण को एक अलग प्रक्रिया में रहने की आवश्यकता नहीं है, इसे बस वर्तमान निष्पादन वातावरण की नकल करने की आवश्यकता है। इसमें ksh93एक virtual sub-shellतंत्र द्वारा किया जाता है जो कॉल नहीं करता है fork()। यह ksh93 को बहुत तेजी से पुरातन प्लेटफार्मों पर बनाता है Win-DOS, जैसे कि फोर्किंग के Win-DOSसाथ बेहद धीमा है।

sh -c cmd दूसरी तरफ डिफ़ॉल्ट शेल के साथ एक नई प्रक्रिया बनाता है जिसे आपके वर्तमान इंटरेक्टिव शेल के समान होने की आवश्यकता नहीं है।

यहां तक ​​कि जब shऔर आपके वर्तमान शेल समान होते हैं, तो यह निष्पादन वातावरण को डुप्लिकेट नहीं करता है और इस प्रकार एक नहीं बनाता है sub-shell


तो, सिवाय अन्य गोले में ksh93, सबस्क्रिप्शन एक बच्चे के खोल सही है?
cuonglm

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