जब आप का उपयोग 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?