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


54

मेरे पास कई अमेज़ॅन ईसी 2 खाते हैं और जल्दी से $EC2_HOMEस्क्रिप्ट का उपयोग करके चर जैसे स्विच करने में सक्षम होना चाहते हैं ।

मेरे पास एक शेल स्क्रिप्ट इस तरह सेट है:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

जब मैं उस स्क्रिप्ट को चलाता हूं जो मुझे पता है कि EC2_HOMEसेट है, लेकिन मैंने सोचा था कि exportस्क्रिप्ट पूरी होने के बाद चर छड़ी का उपयोग किया जाएगा। ऐसा नहीं है, जैसा चल रहा echo $EC_HOMEहै कुछ भी नहीं दिखाता है।

मुझे पता है कि यह बहुत अल्पविकसित लिनक्स स्क्रिप्टिंग ज्ञान होना चाहिए, लेकिन मुझे यह पता नहीं है। मैंने भाग्य के बिना संबंधित प्रश्नों की तलाश करने की कोशिश की - इसलिए मेरी माफी अगर यह एक डुप्लिकेट है।

जवाबों:


60

आपको अपनी स्क्रिप्ट का स्रोत बनाना चाहिए

. ./script

या

source ./script

19
कारण यह है कि आपकी स्क्रिप्ट वर्तमान शेल के बच्चे के रूप में एक नई शेल प्रक्रिया को जन्म देती है। बच्चे की प्रक्रिया में आपके द्वारा किया गया कोई भी पर्यावरण परिवर्तन माता-पिता को प्रभावित नहीं कर सकता है । जब आप उपयोग करते हैं .या source, आप एक नई बच्चे की प्रक्रिया को पैदा नहीं कर रहे हैं, तो आप वर्तमान शेल में कमांड चला रहे हैं।
ग्लेन जैकमैन

1
@glennjackman मैं एक ऐसी ही समस्या है और मैं अपने समाधान की कोशिश की है, लेकिन यह मेरे खोल से लॉग जब मैं करता हूँ .या source। ये क्यों हो रहा है ?
पेट्रीक

7
@Patryk: हो सकता है कि आपकी स्क्रिप्ट में एक exitस्टेटमेंट हो, इसलिए यह उपयुक्त नहीं है।
enzotib

जबकि source ./scriptपूरी तरह से ठीक काम करता है, sudo source ./script.shकहते हैं sudo: source: command not found। मैं सुडोल का उपयोग कैसे कर सकता हूं?
71GA

1
@ 71GA: कमांड के साथ चलने पर आप अपने वातावरण की sudoकॉन्फ़िगरेशन सेटिंग के आधार पर संकलन वरीयताओं के आधार पर और /etc/sudoersअपने वातावरण को संरक्षित नहीं कर सकते sudo। मेरा सुझाव है कि आप अपनी स्क्रिप्ट को स्रोत बनाने की कोशिश करें, और फिर पर्यावरण को संरक्षित करने के विकल्प के sudoसाथ दौड़ें -E। अगर यह काम नहीं करता है, तो मुझे लगता है कि आप बहुत कम कर सकते हैं।
13

35

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

$ source ./a.sh

या समतुल्य (लेकिन थोड़ा और अधिक सुस्पष्ट रूप से) POSIX डॉट कमांड का उपयोग करें :

$ . ./a.sh

फिर परिभाषाओं को आपके वर्तमान शेल के वातावरण में डाल दिया जाएगा और आपके द्वारा लॉन्च किए गए किसी भी कार्यक्रम से विरासत में मिलेगा।

स्क्रिप्ट चलाने के करीब होने के लिए, पर्यावरण चर . a.shमें निर्देशिकाओं को खोजकर a.sh मिलेगा PATH


इन कैसे व्यवहार में कुछ बारीकियों रहे हैं, और कि क्या .और source(सब पर या वर्तमान) एक ही हैं। . ./a.shनिश्चित रूप से प्रत्येक POSIX- संगत शेल में समान व्यवहार करेगा, लेकिन sourceऔर ., . a.shऔर . ./a.sh, भिन्न हो सकते हैं। बैश के लिए sourceऔर. सभी मामलों में समान हैं ; के लिए zsh sourceहमेशा पहले वर्तमान निर्देशिका की जाँच करता है ; ksh मूल रूप से समान है।

यदि स्क्रिप्ट नाम एक पथ (युक्त /) के रूप में दिया गया है , तो वह पथ सभी मामलों में सीधे उपयोग किया जाता है। सबसे अधिक विश्वसनीय बात यह है कि . ./scriptया है . /path/to/script


1

सिर्फ रिकॉर्ड के लिए।

यदि आप इंटरनेट से स्क्रिप्ट चलाना चाहते हैं जो सिस्टम में एनवी को एक्सपोर्ट करता है

आप निम्न प्रारूप का उपयोग कर सकते हैं

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

उदाहरण के लिए:

source <(curl -s -L https://example.com/install.sh)

यदि आप उस स्क्रिप्ट पर भरोसा करते हैं तो खतरनाक लेकिन उपयोगी लगता है!
मार्क स्टीवर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.