एक शेल स्क्रिप्ट में वैश्विक पर्यावरण चर


83

कैसे एक बैश स्क्रिप्ट में एक वैश्विक पर्यावरण चर सेट करने के लिए?

अगर मैं सामान की तरह

#!/bin/bash
FOO=bar

... या

#!/bin/bash
export FOO=bar

... var स्थानीय संदर्भ में रहने लगते हैं, जबकि स्क्रिप्ट निष्पादित होने के बाद मैं उनका उपयोग करना चाहता हूं।

जवाबों:


141

के साथ अपनी स्क्रिप्ट चलाएँ .

. myscript.sh

यह वर्तमान शेल वातावरण में स्क्रिप्ट चलाएगा।

export नई प्रक्रिया के लिए कौन से चर उपलब्ध होंगे, इसलिए यदि आप कहते हैं

FOO=1
export BAR=2
./runScript.sh

तब $BARके वातावरण में उपलब्ध होगा runScript.sh, लेकिन $FOOनहीं होगा।


27
उस पहले से सावधान रहें। बिना स्लैश के, यह आपके रास्ते में दिखेगा: किसी चीज़ का उपयोग करें '। यदि आप यह सुनिश्चित करना चाहते हैं कि यह एक विशिष्ट रन हो।
paxdiablo

13
sourceके लिए एक उपनाम है .। इसलिए आप source myscript.shइसके बजाय दौड़ सकते हैं , अगर आप अधिक स्पष्ट होना चाहते हैं।
एहतेश चौधरी

मैं सोच रहा हूं कि क्या होता है जब मैं एक स्क्रिप्ट को डॉट और स्पेस के साथ चलाता हूं। उदाहरण । myscript
cNgamba

54

जब आप एक शेल स्क्रिप्ट चलाते हैं , तो यह सब-शेल में किया जाता है, इसलिए यह पेरेंट शेल के वातावरण को प्रभावित नहीं कर सकता है। आप ऐसा करके स्क्रिप्ट को स्रोत बनाना चाहते हैं:

. ./setfoo.sh

यह इसे वर्तमान शेल के संदर्भ में निष्पादित करता है , उप शेल के रूप में नहीं ।

बैश मैन पेज से:

। फ़ाइल नाम [तर्क]
स्रोत फ़ाइल नाम [तर्क]

वर्तमान शेल वातावरण में फ़ाइल नाम से आदेशों को पढ़ें और निष्पादित करें और फ़ाइलनाम से निष्पादित अंतिम कमांड की निकास स्थिति को वापस करें।

यदि फ़ाइल नाम में स्लैश नहीं है, तो फ़ाइल नाम का उपयोग निर्देशिका में फ़ाइल नाम रखने के लिए किया जाता है।

PATH में खोज की गई फ़ाइल निष्पादन योग्य नहीं है। जब पॉश POSIX मोड में नहीं होता है, तो PATH में कोई फ़ाइल नहीं मिलने पर वर्तमान निर्देशिका को खोजा जाता है।

अगर दुकानदार कमांड को सोर्सपाट विकल्प बंद कर दिया जाता है, तो PATH की खोज नहीं की जाती है।

यदि किसी भी तर्क की आपूर्ति की जाती है, तो फ़ाइल नाम निष्पादित होने पर वे स्थितिगत पैरामीटर बन जाते हैं।

अन्यथा स्थितिगत पैरामीटर अपरिवर्तित हैं। वापसी की स्थिति स्क्रिप्ट के भीतर बाहर निकलने वाले अंतिम कमांड की स्थिति है (0 यदि कोई कमांड निष्पादित नहीं होती है), और फ़ाइल नाम नहीं मिला है या नहीं पढ़ा जा सकता है।


दिलचस्प - मैंने पहले उस वाक्यविन्यास को नहीं देखा है। क्या यह स्रोत के बराबर है ।/setfoo.sh?
ire_and_curses

2
यह समान है, बस टाइप करने के लिए तेज़ (और पुराने सिस्टम पर अधिक संगत - ksh के पास कोई स्रोत कमांड नहीं है लेकिन यह है। '')।
paxdiablo

9

source myscript.sh भी संभव है।

लिनक्स कमांड के लिए विवरण source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context

शायद यहाँ एक और अधिक विस्तार से बालक। कैसे के बारे में एक बहुत ही संक्षिप्त विवरण क्या sourceकरता है?
फिलिप क्लाउड

@PhillipCloud man sourceटर्मिनल में टाइप करें और आपको वही मिलेगा जो आप चाहते हैं।
सीडीटी

5
मैं परिचित हूं source। शायद ओपी नहीं है।
फिलिप क्लाउड

2
@PhillipCloud मैं खुद कुछ और विस्तार चाहूंगा। यदि आप उत्तर को संपादित करना चाहते हैं, तो आप निश्चित रूप से ऐसा कर सकते हैं। कारण और सभी कि मदद ... Thx!
डैन रोसेनस्टार्क

4
#!/bin/bash
export FOO=bar

या

#!/bin/bash
FOO=bar
export FOO

आदमी निर्यात:

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


कृपया, शेल स्क्रिप्टिंग में हर शुरुआत करने वाले को ध्यान दें: एन्वार नाम, '=' वर्ण और स्वयं के बीच कोई रिक्त नहीं है; यह काम नहीं करेगा:export FOO = /mydir/bar
russellhoff

-3
FOO=bar
export FOO

2
यह काम नहीं करता है, यह मूल प्रक्रिया के लिए पर्यावरण चर सेट नहीं करता है।
ड्रीमलैक्स

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