मेरे बैश स्क्रिप्ट निर्यात चर क्यों नहीं हो सकते?


4

मैं MSYS का उपयोग कर रहा हूं और चर के साथ एक फ़ाइल vars.txt है, जैसे मान कुंजी:

WINDIR C:/WINDOWS
STS_BUILD_DIRECTORY D:/STS/TMP
ALLUSERSPROFILE C:/Documents and Settings/All Users

मैं इसे पर्यावरण चर में सेट और पढ़ना चाहता हूं। मेरे पास एक बैश स्क्रिप्ट सेटेनव है:

while read var value;
do
  echo "performing export $var=$value"
  export $var='$value'
done 

और मैं इसके साथ फोन करता हूं

cat vars.txt | source setenv

हालाँकि मेरे वातावरण में चर सेट नहीं हैं। मैंने इसे एक समारोह में बनाने की कोशिश की लेकिन कोई खुशी नहीं हुई। यहाँ कोई भी जानता है कि मैं क्या गलत कर रहा हूँ? धन्यवाद।


1
setenv आपकी स्क्रिप्ट के लिए एक खराब नाम है, क्योंकि यह कई गोले में एक बिलिन का नाम है।
Daenyth

@Daenyth धन्यवाद - हाँ, यह उस समय गलत लग रहा था, लेकिन लगता है कि यह नहीं है। Mapenv एक बेहतर नाम वैसे भी है;)
danio

अगर मैंने स्क्रिप्ट की सोर्सिंग के बाद पाइप जोड़ दिया तो मुझे भी यही मुद्दा मिला (vars set नहीं)। जैसे 'source setit.sh' var सेट ठीक है, 'source setit.sh | tee setit.log' var सेट नहीं हैं। चौंका देने वाला। सहज नहीं है। ध्यान रहे।
gaoithe

जवाबों:


7

पाइप एक उपधारा सेट करता है। जब सबस्क्रिप्शन बाहर निकलता है, तो चर खो जाते हैं।

इसे इस्तेमाल करे:

source setenv < vars.txt

इसके अलावा आपके एकल उद्धरण चर के विस्तार को रोक सकते हैं (मुझे नहीं पता कि क्या यह MSYS में सच है)। बदलने की कोशिश करो export इसके लिए लाइन:

export $var="$value"

आप उपयोग कर सकते हैं declare के बजाय export यदि चर को निर्यात करने की आवश्यकता नहीं है।


तो मैं अस्थायी फ़ाइलों का उपयोग करने के लिए है? (vars.txt सिर्फ परीक्षण के लिए था) मेरे पास एक फ़ंक्शन है जो vars.txt उत्पन्न करता है। यह इसके साथ ठीक काम करता है: Gener_envmap & gt; /tmp/envmap.txt; apply_env & lt; /tmp/envmap.txt। जनरेट करने के लिए अच्छा होगा | apply_env।
danio

2
@ डानियो: मैंने सिर्फ आपके उदाहरण पर अपना जवाब आधारित किया है। आपने कहा कि "आपके पास एक फ़ाइल है"। मुझे नहीं पता था कि आपके पास पहले से फ़ाइल नहीं थी। आप बैश में प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं: source apply_env < <(generate_envmap)
Dennis Williamson

धन्यवाद कि मैं क्या चाहता हूँ लगता है, लेकिन bash के MSYS संस्करण को लागू करने की प्रक्रिया नहीं लगती है :-(
danio

@ डानियो: यहां स्ट्रिंग और कमांड प्रतिस्थापन का उपयोग करने का प्रयास करें: source apply_env <<< $(generate_envmap)
Dennis Williamson

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