शेल वैरिएबल बनाम एनवायरनमेंटल वैरिएबल, दोनों में एक ही नाम होने पर कौन सा पसंद किया जाता है?


10

बैश में निम्नलिखित टाइप करना:

env | grep USER

तथा

set | grep USER

दोनों बार एक ही उपयोगकर्ता नाम देता है।

मुझे कैसे पता चलेगा कि टाइप करते समय echo $USERयदि शेल या पर्यावरण चर प्रदर्शित किया गया है?

जवाबों:


14

के लिए POSIX संगत गोले (बैश सहित), मानक का कहना है:

2.5.3 शैल वैरिएबल
चर को पर्यावरण से आरंभ किया जाएगा [...] यदि एक चर पर्यावरण से आरम्भ किया जाता है, तो इसे तुरंत निर्यात के लिए चिह्नित किया जाएगा; निर्यात विशेष निर्मित में देखें। नए चर को परिभाषित किया जा सकता है और चर असाइनमेंट के साथ आरंभ किया जा सकता है, [आदि]

और के बारे में export:

export name[=word]...
शेल निर्दिष्ट नामों के अनुरूप चर को निर्यात विशेषता देगा, जिससे उन्हें बाद में निष्पादित आदेशों के वातावरण में हो जाएगा।

तो शेल के दृष्टिकोण से, केवल चर हैं। उनमें से कुछ पर्यावरण से आ सकते हैं जब शेल शुरू किया गया था, और उनमें से कुछ शेल शुरू होने वाली प्रक्रियाओं के पर्यावरण को निर्यात किया जा सकता है।

("वातावरण" वास्तव में शुरू होने पर प्रक्रिया के लिए पारित स्ट्रिंग्स का एक गुच्छा है। जब प्रक्रिया चल रही होती है, तो यह जो कुछ भी इसे पसंद करता है वह इसे कर सकता है, इसका उपयोग कर सकता है, इसे अनदेखा कर सकता है, इसे अधिलेखित कर सकता है और एक प्रक्रिया क्या गुजरती है। अन्य प्रक्रियाओं को शुरू करते समय अभी तक एक और बात हो सकती है, हालांकि यह सामान्य रूप से सभी पर्यावरण चर को फिर से पारित करने के लिए सामान्य है।)


यदि आप कुछ गैर- POSIX शेल का उपयोग कर रहे हैं, जैसे कि csh, चीजें अलग हो सकती हैं:

$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit

1
ध्यान दें कि बॉश शेल, जैसे csh पर्यावरण चर से शेल वेरिएबल को इनिशियलाइज़ करता है। जब तक आप उन्हें निर्यात नहीं करते शेल शेल चर को संशोधित करना पर्यावरण परिवेश को प्रभावित नहीं करता। यह कुछ ऐसा है जो कोर्न शेल (और पोसिक्स द्वारा निर्दिष्ट) द्वारा तोड़ा गया था । इसीलिए आपको शेल वेरिएबल्स के नाम से सावधान रहना चाहिए जिसका उपयोग अब आप यह सुनिश्चित करने के लिए कर रहे हैं कि आप env var को संशोधित नहीं कर रहे हैं जो आपके स्क्रिप्ट में चलने वाले कमांड को प्रभावित कर सकता है।
स्टीफन चेज़लस

4

ये एक और एक ही चर हैं। शेल में, जैसा कि अधिकांश अन्य प्रोग्रामिंग भाषाओं में विरोध किया जाता है, पर्यावरण चर और शेल चर समान नाम स्थान साझा करते हैं। शेल में, एक पर्यावरण चर एक शेल चर है जिसे निर्यात किया गया है export

उदाहरण के लिए, अपने पिछले प्रश्न के लिए मेरा उत्तर " शेल चर और पर्यावरण चर के बीच उपयोग में अंतर क्या है? "


मैं आपके स्पष्टीकरण पर फिर से विचार करूंगा, केवल मुझे कुछ चीजें सीखने की जरूरत है, इससे पहले कि मैं आपके उत्तर को समझ सकूं।
शार्क

@ क्षारक कोई चिंता नहीं करता है। अगर मैं चीजों को भ्रमित कर रहा हूं, तो मुझे बताएं और मैं स्पष्ट करने की कोशिश करूंगा। इलकाचु का जवाब भी अच्छा है।
Kusalananda

नहीं, मुझे नहीं लगता, आपके पास स्पष्टीकरण की एक अच्छी शैली है, यह केवल मेरे ज्ञान की कमी है जो अभी तक उन्हें संजो नहीं सकते हैं।
शार्क

2

शेल वैरिएबल का उपयोग केवल वर्तमान शेल के लिए किया जा सकता है, इसका उपयोग सिस्टम वाइड में नहीं किया जा सकता है। दूसरे छोर पर पर्यावरणीय चर का उपयोग सिस्टम वाइड किया जा सकता है। कन्वेंशन द्वारा शेल वैरिएबल को लोअरकेस के रूप में लिखा जाता है जबकि पर्यावरण वैरिएबल को अपरकेस के रूप में लिखा जाता है। आप एक शेल वैरिएबल को एक पर्यावरण चर के रूप में काम कर सकते हैं, आपको बस इसे निर्यात करने की आवश्यकता है।

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