जब आप का उपयोग LANG=C gcc ...
क्या होता है कि खोल के लिए सेट LANG है gcc
की पर्यावरण केवल , और नहीं के लिए वर्तमान वातावरण में ही ( टिप्पणी देखें )। तो gcc
खत्म होने के बाद , LANG
अपने पिछले मूल्य (या परेशान) पर वापस आ जाता है।
इसके अतिरिक्त, जब आप इसका उपयोग A=10 echo $A
करते हैं तो वह शेल होता है जो $ A की जगह लेता है, न कि प्रतिध्वनि, और इस प्रतिस्थापन (जिसे "विस्तार" कहा जाता है) कथन के मूल्यांकन (असाइनमेंट सहित ) से पहले होता है, इसलिए अपेक्षित रूप से काम करने के A
लिए पहले से ही मूल्य निर्धारित होना चाहिए। में वर्तमान कि बयान करने से पहले पर्यावरण।
इसीलिए A=10 echo $A
अपेक्षित रूप से काम नहीं करता है: A=10
इको के लिए सेट किया जाएगा, लेकिन इको आंतरिक रूप से पर्यावरण चर के मूल्य की अनदेखी करता है A
। और वर्तमान शेल (जो कोई नहीं है) $A
में निर्धारित मूल्य के साथ बदल दिया जाता है , और फिर गूंज के तर्क के रूप में पारित किया जाता है।
तो आपकी धारणा सही है: काम VAR=value command
करता है , लेकिन यह केवल तभी प्रासंगिक है जब command
आंतरिक रूप से VAR का उपयोग करता है । यदि नहीं, तो आप अभी भी पारित कर सकते हैं value
एक के रूप में तर्क करने के लिए command
है, लेकिन तर्क की जगह वर्तमान , खोल ताकि वे उपयोग करने से पहले निर्धारित किया जाना चाहिए:VAR=value; command "$VAR"
यदि आप एक निष्पादन योग्य स्क्रिप्ट बनाना जानते हैं, तो आप इसे परीक्षण के रूप में आज़मा सकते हैं:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
इसे सहेजें testscript
और कोशिश करें:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
अंतिम लेकिन कम से कम, यह शेल और पर्यावरण चर और कार्यक्रम तर्कों के बीच अंतर जानने के लायक है ।
यहाँ कुछ अच्छे संदर्भ दिए गए हैं:
।
(*) नोट: तकनीकी रूप से खोल करता भी वर्तमान वातावरण में सेट है, और यहाँ है क्यों: कुछ आदेश, जैसे echo
, read
और test
कर रहे हैं खोल builtins , और इस तरह के रूप में वे एक बच्चे की प्रक्रिया अंडे नहीं है। वे वर्तमान परिवेश में चलते हैं। लेकिन शेल केवल असाइनमेंट के लिए ध्यान रखता है जब तक कि कमांड चल रहा है, इसलिए सभी व्यावहारिक उद्देश्यों के लिए प्रभाव समान है: असाइनमेंट केवल उस एकल कमांड द्वारा देखा जाता है।
A=10 (echo $A)
और प्राप्त कर सकता हूं10
?