पर्यावरण चर और एक कमांड के बीच एक अर्ध-उपनिवेश का उपयोग करने के लिए कब


14

क्या कोई समझा LANGसकता है कि बैश द्वारा अपडेट किए जाने के लिए अर्ध-बृहदान्त्र आवश्यक क्यों है ?

काम नहीं करता है:

> LANG=Ja_JP bash -c "echo $LANG"
en_US

काम करता है:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

मैं लाइनक्स पर बैश 4.1.10 और साइबरविन के तहत एक ही संस्करण के साथ काम कर रहा हूं

जवाबों:


23

पैरामीटर और अन्य प्रकार के विस्तार तब किए जाते हैं जब कमांड पढ़ा जाता है, इससे पहले कि यह निष्पादित हो।

पहला संस्करण, LANG=Ja_JP bash -c "echo $LANG"एक एकल आदेश है। के बाद इसे इस तरह से पार्स किया जाता है, कुछ भी निष्पादित होने $LANGसे en_USपहले इसका विस्तार किया जाता है। एक बार bashइनपुट संसाधित करने के बाद, यह एक प्रक्रिया की मांग करता है, LANG=Ja_JPजैसा कि अपेक्षित है, पर्यावरण में जोड़ता है और फिर निष्पादित होता है bash -c echo en_US

आप सिंगल कोट्स यानी LANG=Ja_JP bash -c 'echo $LANG'आउटपुट के साथ विस्तार को रोक सकते हैं Ja_JP

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

दूसरा संस्करण, LANG=Ja_JP; bash -c "echo $LANG"वास्तव में अनुक्रम में निष्पादित दो अलग-अलग कमांड हैं। पहला एक कमांड के बिना एक सरल चर असाइनमेंट है, इसलिए यह आपके वर्तमान शेल को प्रभावित करता है।

इस प्रकार, आपके दो स्निपेट एकल के सतही भेद के बावजूद मौलिक रूप से भिन्न हैं ;

पूरी तरह से बंद विषय, लेकिन मैं .UTF-8जब एक सेटिंग की सिफारिश कर सकते हैं LANG। आजकल 21 वीं सदी में यूनिकोड का उपयोग न करने का कोई अच्छा कारण नहीं है।


शानदार जवाब - धन्यवाद! UTF-8 के अतिरिक्त के बारे में। मैं एक आवेदन के स्थानीय हैंडलिंग का परीक्षण करने की कोशिश कर रहा हूं, जिसमें कई प्लेटफार्मों पर काम करने की आवश्यकता है, जिनमें से कुछ काफी पुराने हैं। इस अंतर के बीच एक (जो शुक्र है कि आपने समझाया है) और linux और cygwin पर मतभेद मैं खुद को एक बस के नीचे फेंकने वाला हूं!
रिचर्ड कॉर्डन

5

VAR=value; somecommand के बराबर है

VAR=value
somecommand

ये असंबंधित आदेश एक के बाद एक निष्पादित किए जाते हैं। पहला कमांड शेल वैरिएबल के लिए एक मान प्रदान करता है VAR। जब तक VARपहले से ही एक पर्यावरण चर नहीं है, तब तक इसे पर्यावरण को निर्यात नहीं किया जाता है, यह शेल के लिए आंतरिक रहता है। एक बयान पर्यावरण को export VARनिर्यात करेगा VAR

VAR=value somecommandएक अलग वाक्यविन्यास है। असाइनमेंट VAR=valueपर्यावरण के लिए है, लेकिन यह असाइनमेंट केवल निष्पादन वातावरण में बनाया गया है somecommand, शेल के बाद के निष्पादन के लिए नहीं।

उदाहरण के माध्यम से:

# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1                        # displays "value"
env | grep '^VAR1='               # displays nothing
VAR2=value env | grep '^VAR2='    # displays "VAR2=value"
echo $VAR2                        # displays nothing

मैंने वास्तव में शेल बनाम पर्यावरण चर के बीच के अंतर के बारे में नहीं सोचा था। मुझे कुछ शोध करने जाना होगा। जवाब के लिए धन्यवाद।
रिचर्ड कॉर्डन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.