मुझे दूसरे से एक शेल उदाहरण के पर्यावरण चर को स्थापित करने में दिलचस्पी है। इसलिए मैंने कुछ शोध करने का फैसला किया। एक को पढ़ने के बाद संख्या के सवाल के बारे में इस मैं इसे बाहर का परीक्षण करने का फैसला किया।
मैंने दोनों गोले A और B (PID 420) को चलाया, दोनों चल रहे थे zsh। शेल से एआई ने निम्नलिखित भाग किया।
sudo gdb -p 420
(gdb) call setenv("FOO", "bar", 1)
(gdb) detach
शेल बी से जब मैं दौड़ता envहूं तो मैं देख सकता हूं कि वेरिएबल FOO वास्तव में बार के मान के साथ सेट है। इससे मुझे लगता है कि FOO को शेल बी के वातावरण में सफलतापूर्वक आरंभीकृत किया गया है। हालांकि, अगर मैं FOO को प्रिंट करने का प्रयास करता हूं तो मुझे एक खाली लाइन मिलती है जिसका अर्थ है कि यह सेट नहीं है। मेरे लिए, ऐसा लगता है कि यहाँ एक विरोधाभास है।
यह मेरे अपने आर्क जीएनयू / लिनक्स सिस्टम और एक उबंटू वीएम दोनों पर परीक्षण किया गया था। मैंने इस पर भी परीक्षण किया bashकि चर भी env में नहीं दिखा था। हालांकि यह मेरे लिए निराशाजनक है, यह समझ में आता है कि यदि शेल स्पॉन समय पर अपने पर्यावरण की एक प्रति को कैश करता है और केवल उसी का उपयोग करता है (जो लिंक किए गए प्रश्नों में से एक में सुझाया गया था)। यह अभी भी जवाब नहीं zshदेता है कि चर क्यों देख सकते हैं।
echo $FOOखाली का उत्पादन क्यों होता है ?
संपादित करें
टिप्पणियों में इनपुट के बाद मैंने कुछ और परीक्षण करने का फैसला किया। परिणाम नीचे दी गई तालिकाओं में देखे जा सकते हैं। पहले कॉलम में वह शेल है जिसे FOOवेरिएबल में इंजेक्ट किया गया था। पहली पंक्ति में कमांड होती है जिसका आउटपुट इसके नीचे देखा जा सकता है। चर FOOका उपयोग करके इंजेक्ट किया गया था sudo gdb -p 420 -batch -ex 'call setenv("FOO", "bar", 1)':। Zsh के लिए विशिष्ट कमांड: zsh -c '...'बैश का उपयोग करके भी परीक्षण किया गया। परिणाम समान थे, उनका उत्पादन संक्षिप्तता के लिए छोड़ा गया था।
आर्क GNU / Linux, zsh 5.3.1, बैश 4.4.12 (1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
Ubuntu 16.04.2 LTS, zsh 5.1.1, बैश 4.3.48 (1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
उपरोक्त का अर्थ है कि परिणाम वितरण अज्ञेय हैं। यह मुझे बहुत अधिक नहीं बताता है zshऔर bashचर की सेटिंग को अलग तरीके से संभालता है। इसके अलावा, export FOOशेल के आधार पर इस संदर्भ में बहुत अलग व्यवहार है। उम्मीद है कि ये परीक्षण किसी और के लिए कुछ स्पष्ट कर सकते हैं।
env) संशोधित वातावरण को देखते हैं।
zshकि GDB के लिए एक पर्यावरण चर सेट करना इसे शेल चर के रूप में दिखाई नहीं देता है, लेकिन इसका कारण बाल प्रक्रियाओं को पारित करना है (के रूप में) आप) देखा है, के लिए एक सेट करते समय bash करता है यह एक खोल चर के रूप में दिखाई दे रहा है, लेकिन है नहीं यह बच्चे प्रक्रियाओं को पारित करने के लिए कारण हो! ऐसा लगता है कि zsh और bash वैरिएबल के प्रबंधन के लिए अलग-अलग रणनीतियों का उपयोग करते हैं, zsh ट्रैकिंग नॉन-एनवायरनमेंट वैरिएबल के साथ और अपने वातावरण में हर चीज को स्टोर करने के लिए, जिसे वह (नॉन-सबशेल) बच्चे को लॉन्च करते समय साफ करता है।
export FOOहै bash?
zsh -c 'echo $FOO'इसके बजाय एक (एकल उद्धरण का उपयोग करें!) करते हैं क्या आप इसे देख सकते हैं?