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


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

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

#!/bin/bash
FOO=bar

... या

#!/bin/bash
export FOO=bar

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


76
2017-09-23 06:25


मूल




जवाब:


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

. myscript.sh

यह मौजूदा शैल पर्यावरण में स्क्रिप्ट चलाएगा।

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

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

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


124
2017-09-23 06:28



उस पहले से सावधान रहें। एक स्लैश के बिना, यह आपके पथ में दिखेगा: कुछ 'जैसे' का उपयोग करें। ./myscript.sh 'अगर आप यह सुनिश्चित करना चाहते हैं कि यह एक विशिष्ट चलाता है। - paxdiablo
source के लिए एक उपनाम है .। तो आप दौड़ सकते हैं source myscript.sh इसके बजाय, यदि आप अधिक स्पष्ट होना चाहते थे। - Ehtesh Choudhury


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

. ./setfoo.sh

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

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

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

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

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

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

अगर shopt अंतर्निहित कमांड विकल्प को बंद कर दिया गया है,   पाथ की खोज नहीं की गई है।

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

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


47
2017-09-23 06:29



दिलचस्प - मैंने पहले उस वाक्यविन्यास को नहीं देखा है। क्या यह स्रोत के बराबर है ./setfoo.sh? - ire_and_curses
यह वही है, टाइप करने के लिए बस तेज़ (और पुराने सिस्टम पर अधिक संगत - ksh के पास कोई स्रोत कमांड नहीं है लेकिन इसमें '।' है।)। - paxdiablo


source myscript.sh भी व्यवहार्य है।

Linux कमांड के लिए विवरण source:

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

6
2017-09-01 00:48



शायद यहां एक और अधिक जानकारी है। क्या के बारे में एक संक्षिप्त विवरण के बारे में source कर देता है? - Phillip Cloud
@PhillipCloud प्रकार man source टर्मिनल में और आप जो चाहते हैं उसे प्राप्त करेंगे। - CDT
मैं परिचित हूँ source। शायद ओपी नहीं है। - Phillip Cloud
@PhillipCloud मैं खुद को कुछ और विस्तार करना चाहूंगा। अगर आप उत्तर को संपादित करना चाहते हैं, तो आप निश्चित रूप से ऐसा कर सकते हैं। कारण और सभी की मदद करें ... Thx! - Dan Rosenstark


#!/bin/bash
export FOO=bar

या

#!/bin/bash
FOO=bar
export FOO

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

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


4
2017-09-23 06:33



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


FOO=bar
export FOO

-3
2017-09-23 06:27



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