क्या मैं इसे सोर्स किए बिना एक bash स्क्रिप्ट से पर्यावरण को एक चर निर्यात कर सकता हूं?


282

मान लीजिए कि मेरे पास यह स्क्रिप्ट है

निर्यात :

#! /usr/bin/env bash
export VAR="HELLO, VARIABLE"

जब मैं स्क्रिप्ट निष्पादित करता हूं और एक्सेस करने का प्रयास करता $VARहूं, तो मुझे कोई मूल्य नहीं मिलता है!

echo $VAR

वहाँ किसी भी तरह से इसे निर्यात करने के बिना निर्यात करने के लिए उपयोग करने के लिए कोई रास्ता $VARहै। यह सोर्सिंग के बिना?


1
आप अपने चर को परिभाषित करने के लिए स्क्रिप्ट के बजाय अन्य उपनाम का उपयोग करने का प्रयास कर सकते हैं।
jdigital

जिस स्क्रिप्ट पर मैं काम कर रहा हूं, वह एक तरह का जावा वर्चुअल मैनेजर है, मैं कुछ कंपीटिशन करता हूं, फिर मुझे एक $ JAVA_HOME को एएनवी को एक्सपोर्ट करना चाहिए, और इसे PATH में जोड़ना चाहिए।
तारसल्लाह

ठीक है, आप किसी फ़ाइल को जानकारी लिख सकते हैं और फिर उसे वापस पढ़ सकते हैं, लेकिन सोर्सिंग बहुत आसान लगती है।
१igit

7
बाल प्रक्रियाएं अपने माता-पिता के वातावरण को बदल नहीं सकती हैं। माता-पिता अपने आप में (या तो साथ बदलने के लिए चुनने के लिए sourceया evalया ...)
ग्लेन जैकमैन

1
स्रोत पर अधिक पढ़ने के लिए, man sourceकाम नहीं करेगा क्योंकि sourceबैश में बनाया गया है, आपको चलाने की जरूरत हैhelp source
पेटेरकुला

जवाबों:


318

वहाँ किसी भी तरह से यह सोर्सिंग के बिना $VARनिष्पादित द्वारा उपयोग करने के लिए कोई रास्ता export.bashनहीं है?

त्वरित उत्तर: नहीं।

लेकिन कई संभावित वर्कअराउंड हैं।

सबसे स्पष्ट एक, जिसका आपने पहले ही उल्लेख किया है, कॉलिंग शेल के संदर्भ में स्क्रिप्ट का उपयोग करना sourceया .निष्पादित करना है:

$ cat set-vars1.sh 
export FOO=BAR
$ . set-vars1.sh 
$ echo $FOO
BAR

एक और तरीका स्क्रिप्ट के लिए है, एक पर्यावरण चर सेट करने के बजाय, कमांड को प्रिंट करें जो पर्यावरण चर को सेट करेगा:

$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR

एक तीसरा दृष्टिकोण एक स्क्रिप्ट है जो आपके पर्यावरण चर (ओं) को आंतरिक रूप से सेट करता है और फिर उस वातावरण के साथ एक निर्दिष्ट कमांड देता है:

$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

यह अंतिम दृष्टिकोण काफी उपयोगी हो सकता है, हालांकि यह इंटरैक्टिव उपयोग के लिए असुविधाजनक है क्योंकि यह आपको आपके वर्तमान शेल में सेटिंग्स (सभी अन्य सेटिंग्स और आपके द्वारा बनाए गए इतिहास के साथ) नहीं देता है।


57

VAR वैरिएबल को सबसे अधिक तार्किक रूप से निर्यात करने के लिए और लगता है कि वैरिएबल का स्रोत है:

. ./export.bash

या

source ./export.bash

अब जब मुख्य खोल से गूंज यह काम करता है

 echo $VAR
HELLO, VARABLE

अब हम VAR रीसेट करेंगे

export VAR=""
echo $VAR

अब हम किसी स्क्रिप्ट को वेरिएबल के स्रोत के लिए निष्पादित करेंगे, फिर उसे अनसेट करें:

./test-export.sh 
HELLO, VARABLE
--
.

कोड: कैट टेस्ट-export.sh

    #!/bin/bash
    # Source env variable
    source ./export.bash

    # echo out the variable in test script
    echo $VAR

    # unset the variable 
    unset VAR
    # echo a few dotted lines
    echo "---"
    # now return VAR which is blank
    echo $VAR

यहाँ एक तरीका है

कृपया ध्यान दें: निर्यात स्क्रिप्ट के लिए सीमित हैं जो आपके मुख्य कंसोल में निर्यात को निष्पादित करते हैं - जहां तक ​​एक क्रोन नौकरी है मैं इसे नीचे दिए गए कंसोल की तरह जोड़ूंगा ... कमांड भाग के लिए अभी भी संदिग्ध है: यहां बताया गया है कि आप कैसे हैं अपने शेल से चलाएं:

आपके कमांड प्रॉम्प्ट पर (इसलिए जब तक Export.bash के कई इको मान हैं)

IFS=$'\n'; for entries in $(./export.bash); do  export $entries;  done; ./v1.sh 
HELLO THERE
HI THERE

बिल्ली v1.sh

#!/bin/bash
echo $VAR
echo $VAR1

अब जब तक यह आपके उपयोग के लिए है - तब तक आप किसी भी समय अपनी स्क्रिप्ट के लिए वैरिएबल उपलब्ध करा सकते हैं जैसे:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

इसे अपने .bashrc में जोड़ें

function myvars() { 
    IFS=$'\n'; 
    for entries in $(./export.bash); do  export $entries;  done; 

    "$@"; 

    for entries in $(./export.bash); do variable=$(echo $entries|awk -F"=" '{print $1}'); unset $variable;
done

}

स्रोत अपनी bashrc फ़ाइल और आप किसी भी समय ऊपर की तरह कर सकते हैं ...

किसी भी तरह इसे वापस करने के लिए ..

इसने इसे विश्व स्तर पर उपलब्ध कराया है और फिर स्क्रिप्ट निष्पादित की है।

बस इसे प्रतिध्वनित करें फिर प्रतिध्वनि पर निर्यात चलाएँ!

बिल्ली का निर्यात

#!/bin/bash
echo "VAR=HELLO THERE"

अब स्क्रिप्ट या आपके कंसोल के भीतर:

 export "$(./export.bash)"

प्रयत्न:

echo $VAR
HELLO THERE

जब तक आप जानते हैं कि उपरोक्त विधि का उपयोग करके किसी अन्य स्क्रिप्ट में आप क्या अपेक्षा कर रहे हैं, तब तक कई मान:

बिल्ली का निर्यात

#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"

cat test-export.sh

#!/bin/bash

IFS=$'\n'
for entries in $(./export.bash); do
   export $entries
done

echo "round 1"
echo $VAR
echo $VAR1

for entries in $(./export.bash); do
     variable=$(echo $entries|awk -F"=" '{print $1}');
     unset $variable
done

echo "round 2"
echo $VAR
echo $VAR1

अब परिणाम

 ./test-export.sh 
round 1
HELLO THERE
HI THERE
round 2


.

और ऑटो असाइन करने के लिए अंतिम अंतिम अपडेट VARIABLES पढ़ें:

./test-export.sh 
Round 0 - Export out then find variable name - 
Set current variable to the variable exported then echo its value
$VAR has value of HELLO THERE
$VAR1 has value of HI THERE
round 1 - we know what was exported and we will echo out known variables
HELLO THERE
HI THERE
Round 2 - We will just return the variable names and unset them 
round 3 - Now we get nothing back

स्क्रिप्ट: कैट टेस्ट-export.sh

#!/bin/bash

IFS=$'\n'
echo "Round 0 - Export out then find variable name - "
echo "Set current variable to the variable exported then echo its value"
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 export $entries
 eval current_variable=\$$variable
 echo "\$$variable has value of $current_variable"
done


echo "round 1 - we know what was exported and we will echo out known variables"
echo $VAR
echo $VAR1

echo "Round 2 - We will just return the variable names and unset them "
for entries in $(./export.bash); do
 variable=$(echo $entries|awk -F"=" '{print $1}');
 unset $variable
done

echo "round 3 - Now we get nothing back"
echo $VAR
echo $VAR1

मैं फ़ाइल को निष्पादित करके VAR को निर्यात करना चाहता हूं, न कि इसे सोर्स करके।
तारसाल्लाह

@vahid आपको यह बताना चाहिए कि आपकी स्क्रिप्ट क्या कर रही है।
FDinoff

1
सोर्सिंग के बाद वेरिएबल को अनसेट क्यों नहीं किया जाता? यह बहुत आसान हो सकता है कि दर्द की वजह से आप अपने आप को परीक्षण-निर्यात स्क्रिप्ट को अपडेट करने की कोशिश करेंगे
VH

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

ठीक अंतिम अपडेट - सुझाए गए तरीके के साथ मुद्दों और काम के आसपास bashrc उर्फ ​​विचार शायद एक शानदार तरीका होगा
VH

22

निष्पादित

set -o allexport

इसके बाद किसी फ़ाइल से आपके द्वारा स्रोत किए गए किसी भी चर को आपके शेल में निर्यात किया जाएगा।

source conf-file

जब आप निष्पादित कर रहे हैं। यह allexport मोड को अक्षम कर देगा।

set +o allexport

7
सवाल का पूरा बिंदु "स्रोत के बिना निर्यात कैसे करें" है। यह उत्तर स्रोत का उपयोग करता है।
गोनेन आई

@ekkis हाँ, यह बिल्कुल सवाल का जवाब नहीं देता है, लेकिन जब भी मैं googled कैसे एक फ़ाइल से चर निर्यात करने के लिए यह धागा आया था। तो मैंने इसे अपने लिए रखा।
mdornfe1

उपयोग में सरल और आसान। इसे उत्तर के रूप में चिह्नित किया जाना चाहिए।
QZZ

1
मैंने इसे उकेरा क्योंकि मूल समस्या कथन मुझे यह समझने के लिए प्रेरित करता है कि यह मेरा मौलिक समाधान था। यहाँ allexport पर आधिकारिक डॉक्स हैं: gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
benjaoming

आह, +1। यह प्रश्न bash source exportGoogle में कीवर्ड का शीर्ष परिणाम है
ttimasdf

14

एक फ़ाइल से पर्यावरण चर निर्यात करने के लिए एक दिलचस्प और साफ तरीका मिला:

में env.vars:

foo=test

परीक्षण स्क्रिप्ट:

eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => 

export eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

# a better one
export `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

7

एक और वर्कअराउंड, जो केस पर निर्भर करता है, यह उपयोगी हो सकता है: एक और बैश बनाना जो एक्सपोर्टेड वेरिएबल को इनहेरिट करता है। यह @Keith थॉम्पसन जवाब का एक विशेष मामला है, उन सभी कमियों का होगा।

export.bash:

# !/bin/bash
export VAR="HELLO, VARIABLE"
bash

अभी:

./export.bash
echo $VAR

क्या आपको यकीन है कि आपने जो लिखा है वह काम करता है !? मेरा मानना ​​है कि आपको लाइन कमांड को निष्पादित करना होगा:. ./export.bash
सर जो ब्लैक

@Sir Jo Black, हाँ, ज़रूर। Export.bash फ़ाइल की अंतिम पंक्ति bashवर्तमान शेल के बच्चे के रूप में आह्वान करती है । और चूंकि VARपहले निर्यात किया गया था, उस आह्वान में चर शामिल होगा। बेशक, अगर आप टाइप बाहर जाना होगा। आपने जाँच कर ली है क्या? exitVAR
गनोमेटर

ठीक! मैंने उस आह्वान को नहीं देखा है ...: पी
सर जो ब्लैक

1

जवाब नहीं है, लेकिन मेरे लिए मैंने निम्नलिखित किया

स्क्रिप्ट: myExport

#! \bin\bash
export $1

मेरे .bashrc में एक उपनाम

alias myExport='source myExport' 

फिर भी आप इसे स्रोत बनाते हैं, लेकिन शायद इस तरह यह अधिक उपयोगी है और यह किसी और के लिए दिलचस्प है।


1

हो सकता है कि आप ~ / .zshrc, ~ / .bashrc में एक फ़ंक्शन लिख सकते हैं।

# set my env
[ -s ~/.env ] && export MYENV=`cat ~/.env`
function myenv() { [[ -s ~/.env ]] && echo $argv > ~/.env && export MYENV=$argv }

उपयोग चर के बाहर, आप स्क्रिप्ट फ़ाइल लिखने से बच सकते हैं।

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