उन्हें प्रक्रिया से अलग कर दिया जाता है
अन्य उत्तरदाताओं ने मुझे यह समझने में मदद की कि शेल चर गुंजाइश प्रक्रियाओं और उनके वंशजों के बारे में है ।
जब आप ls
कमांड लाइन पर एक कमांड टाइप करते हैं, तो आप वास्तव में ls
प्रोग्राम को चलाने के लिए एक प्रक्रिया के लिए धन्यवाद कर रहे हैं । नई प्रक्रिया में आपका खोल अपने मूल के रूप में है।
किसी भी प्रक्रिया के अपने "स्थानीय" चर हो सकते हैं, जो कि बाल प्रक्रियाओं में पारित नहीं होते हैं। यह "पर्यावरण" चर भी सेट कर सकता है, जो हैं। उपयोग करने export
से वातावरण परिवर्तनशील बनता है। या तो मामले में, असंबंधित प्रक्रियाएं (मूल के साथी) चर नहीं देखेंगे; हम केवल वही नियंत्रित कर रहे हैं जो बच्चे प्रक्रियाएं देखते हैं।
मान लीजिए आप एक bash खोल, जो हम ए आप टाइप फोन करता हूँ है bash
, जो एक बच्चे की प्रक्रिया बैश खोल, जो हम बी कुछ भी फोन करता हूँ आप कहा जाता है बनाता है export
अभी भी बी में स्थापित किया जाएगा एक में पर
अब, B में, आप कहते हैं FOO=b
। दो चीजों में से एक होगा:
- यदि B को (A) से पर्यावरण चर नहीं कहा जाता है
FOO
, तो उसे स्थानीय चर प्राप्त होगा। B के बच्चे इसे प्राप्त नहीं करेंगे (जब तक कि B कॉल न करें export
)।
- तो बी था (ए) से प्राप्त एक वातावरण चर callled
FOO
, यह होगा वह खुद को और उसके बाद में काँटेदार बच्चों के लिए संशोधित । B के बच्चे को वह मान दिखाई देगा जो B को सौंपा गया है। हालांकि, यह ए को बिल्कुल भी प्रभावित नहीं करेगा।
यहाँ एक त्वरित डेमो है।
FOO=a # set "local" environment variable
echo $FOO # 'a'
bash # forks a child process for the new shell
echo $FOO # not set
exit # return to original shell
echo $FOO # still 'a'
export FOO # make FOO an environment variable
bash # fork a new "child" shell
echo $FOO # outputs 'a'
FOO=b # modifies environment (not local) variable
bash # fork "grandchild" shell
echo $FOO # outputs 'b'
exit # back to child shell
exit # back to original shell
echo $FOO # outputs 'a'
यह सब मेरी मूल समस्या की व्याख्या करता है: मैं GEM_HOME
अपने शेल में सेट करता हूं, लेकिन जब मैंने कॉल किया bundle install
, तो उसने एक बाल प्रक्रिया बनाई। क्योंकि मैंने इस्तेमाल नहीं किया था export
, बच्चे की प्रक्रिया को शेल प्राप्त नहीं हुआ था GEM_HOME
।
संयुक्त राष्ट्र के निर्यात
आप एक वेरिएबल को "अन-एक्सपोर्ट" कर सकते हैं - इसे बच्चों को पास करने से रोकें - उपयोग करके export -n FOO
।
export FOO=a # Set environment variable
bash # fork a shell
echo $FOO # outputs 'a'
export -n FOO # remove environment var for children
bash # fork a shell
echo $FOO # Not set
exit # back up a level
echo $FOO # outputs 'a' - still a local variable
FOO=bar
, कि वर्तमान शेल प्रक्रिया के लिए मान सेट करता है। अगर मैं फिर एक प्रोग्राम (जैसेbundle install
) चलाता हूं, तो एक चाइल्ड प्रोसेस बनता है, जिसे एक्सेस नहीं मिलता हैFOO
। लेकिन अगर मैंने कहा होताexport FOO=bar
, तो बाल प्रक्रिया (और उसके वंशज) उस तक पहुँच पाती । उनमें से एक, बदले में,export FOO=buzz
अपने वंशजों के लिए मूल्य बदलने के लिए कॉल कर सकता है, या केवल अपनेFOO=buzz
लिए मूल्य बदल सकता है। क्या यह सही है?