2013-02-15 36 views
14

में परिभाषित मैं एक स्क्रिप्ट है कि चर एक वातावरण चरनिर्यात चर अन्य फ़ाइल

चर की सूची लगातार बदल के रूप में स्थापित है और मेरे अंत पर इसे संशोधित करने की आवश्यकता है के एक जोड़े में शामिल है एक विकल्प नहीं है। कोई विचार है कि मैं इसे करने के बारे में कैसे जाना होगा?

नमूना फ़ाइल foo.sh

FOO="FOOFOO" 
BAR="BARBAR" 

उत्तर

10

आप के लिए देख रहे '।' आदेश (वर्तनी bash में 'स्रोत'):

source foo.sh 

के बाद आप उन्हें और साथ ही पर्यावरण के लिए निर्यात करने के लिए की जरूरत है, तो आप थोड़ा अतिरिक्त काम करने के लिए आवश्यकता हो सकती है:

while read -r line; do 
    export "$line" 
done < foo.sh 
+0

मैं एक स्क्रिप्ट bar.sh है कि स्रोत foo.sh जबकि लाइन पढ़ बनाया; निर्यात "$ लाइन" किया गया user2077092

+1

आपको वर्तमान वातावरण को प्रभावित करने के लिए 'स्रोत bar.sh'' की आवश्यकता होगी। – chepner

+0

इसके अलावा, 'while' लूप' स्रोत foo.sh' के बजाय है; आपको दोनों की जरूरत नहीं है। यह गलत नहीं है, बस अनावश्यक है। – chepner

39

एक भी नहीं है एक चर और एक पर्यावरण चर के बीच अंतर। यदि आप . foo.sh और foo.sh निष्पादित करते हैं तो FOO=value पंक्ति है, तो परिवर्तनीय FOO वर्तमान प्रक्रिया में असाइन की जाएगी। यह एक पर्यावरण चर नहीं है। एक पर्यावरण परिवर्तनीय बनने के लिए (और इस प्रकार उप-गोले के लिए उपलब्ध हो), इसे निर्यात किया जाना चाहिए। हालांकि, गोले एक विकल्प है जो सभी चर असाइनमेंट एक वातावरण चर चर को बढ़ावा देने प्रदान करते हैं, इसलिए यदि आप बस कार्य करें:

set -a 
. foo.sh 
set +a 

तो foo.sh में सभी चर असाइनमेंट वर्तमान प्रक्रिया में वातावरण चर किया जाएगा। ध्यान दें कि यह सख्ती से सच नहीं है: बैश में, एक चर का निर्यात करने से यह वर्तमान खोल में एक वातावरण चर बन जाता है, लेकिन अन्य गोले (उदाहरण के लिए, डैश, उदाहरण के लिए) चर निर्यात करने से यह वर्तमान खोल में एक पर्यावरण चर नहीं बनता है। (यह यह subshells के वातावरण में स्थापित किया जाना कारण, तथापि करता है।)

+0

बहुत बहुत धन्यवाद, जिसने कुछ सिरदर्द ठीक किया। यह fcron द्वारा संचालित नौकरी के चर चर पार करते समय काम में आता है। – Saucier

+0

... या नलमेलर के पर्यावरण चर से निपटने पर। – Saucier

0

आप, एक आम उपसर्ग के साथ ही चर निर्यात करने के लिए देख रहे हैं जैसे:

BAZ_FOO="FOOFOO" 
BAZ_BAR="BARBAR" 

आप बस ऐसा कर सकता है:

. foo.sh 
variable_list=() 
variable_list=($(set -o posix ; set |\ 
        grep "BAZ_"   |\ 
        cut -d= -f1)) 
for variable in "${variable_list[@]}" 
do 
    export "$variable" 
done