कुंजी / मान जोड़े की फ़ाइल से पर्यावरण चर सेट करें


511

TL; DR: मैं शेल फ़ाइल वातावरण में टेक्स्ट फ़ाइल से कुंजी / मान जोड़े का एक सेट कैसे निर्यात करूं?


रिकॉर्ड के लिए, नीचे प्रश्न का मूल संस्करण है, उदाहरण के साथ।

मैं बैश में एक स्क्रिप्ट लिख रहा हूं, जो एक निश्चित फ़ोल्डर में 3 चर के साथ फ़ाइलों को पार्स करता है, यह उनमें से एक है:

MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt programa.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"

यह फ़ाइल ./conf/prac1 में संगृहीत है

मेरी स्क्रिप्ट minientrega.sh तब इस कोड का उपयोग करके फ़ाइल पार्स करती है:

cat ./conf/$1 | while read line; do
    export $line
done

लेकिन जब मैं minientrega.sh prac1कमांड लाइन में निष्पादित करता हूं तो यह पर्यावरण चर को सेट नहीं करता है

मैंने भी प्रयोग करने की कोशिश की source ./conf/$1लेकिन वही समस्या अभी भी लागू होती है

हो सकता है कि ऐसा करने का कोई और तरीका हो, मुझे बस अपनी स्क्रिप्ट के तर्क के रूप में पास की गई फ़ाइल के पर्यावरण चर का उपयोग करने की आवश्यकता है।



रूबी के साथ भी: stackoverflow.com/questions/2139080/… , एक रत्न जो इसे करता है: github.com/bkeepers/dotenv
Ciro Santilli 郝海东 stack stack 六四

यह एक बहुत अच्छा सवाल है, लेकिन विशेष रूप से चर नामों ("MINIENTREGA_FECHIMITE" के साथ, विशेष रूप से बहुत आसान तरीका है? इसका क्या मतलब है?) और संख्याएँ (3)। सामान्य सवाल यह है कि, "मैं एक टेक्स्ट फ़ाइल से शेल पर्यावरण में कुंजी / मान जोड़े का एक सेट कैसे निर्यात करूं"।
डैन डेस्केल्सस्कु

इसके अलावा, यह पहले से ही यूनिक्स पर उत्तर दिया जा चुका है। यह यकीनन अधिक विषय पर है।
दान डस्केल्सस्कु

जवाबों:


208

अपने दृष्टिकोण के साथ समस्या exportमें हैwhile लूप एक उप शेल में हो रहा है, और वे चर वर्तमान शेल (लूप के मूल शेल) में उपलब्ध नहीं होंगे।

exportफ़ाइल में ही कमांड जोड़ें :

export MINIENTREGA_FECHALIMITE="2011-03-31"
export MINIENTREGA_FICHEROS="informe.txt programa.c"
export MINIENTREGA_DESTINO="./destino/entrega-prac1"

तब आपको वर्तमान शेल में फ़ाइल का उपयोग करने की आवश्यकता होती है:

. ./conf/prac1

या

source ./conf/prac1

4
हालाँकि फ़ाइल लाइन-बाय-लाइन पढ़ना और प्रत्येक लाइन को पास exportकरना आदर्श नहीं है, समस्या को केवल लूप पर इनपुट पुनर्निर्देशन का उपयोग करके भी ठीक किया जा सकता है while read line; do ... ; done < ./conf/$1:।
14

4
और अगर यह एक फ़ाइल से नहीं है, तो उपयोग करें< <(commands that generate output)
o11c

5
आपके पास एक और अधिक स्वच्छ समाधान है , मेरे लिए एक प्राथमिकता हैset -o allexport
हिरलिटी

2
अगर सिस्टम के बीच .env फ़ाइल का उपयोग किया जाता है, तो डालने से exportयह जावा, सिस्टमड या अन्य टूल्स जैसी चीजों के लिए टूट जाएगा
FilBot3

1
awk '{print "export " $0}' envfileहर लाइन की शुरुआत में एक्सपोर्ट को प्रीपेंड करने की सुविधा कमांड
शारज

887

यह सहायक हो सकता है:

export $(cat .env | xargs) && rails c

कारण यह है कि मैं इसका उपयोग करता हूं अगर मैं .envअपने रेल कंसोल में सामान का परीक्षण करना चाहता हूं।

gabrielf एक अच्छा तरीका है चर स्थानीय रखने के लिए के साथ आया था। यह प्रोजेक्ट से प्रोजेक्ट पर जाते समय संभावित समस्या को हल करता है।

env $(cat .env | xargs) rails

मैंने इसके साथ परीक्षण किया है bash 3.2.51(1)-release


अपडेट करें:

इसके साथ शुरू होने वाली लाइनों को अनदेखा करने के लिए #, इसका उपयोग करें ( पीट की टिप्पणी के लिए धन्यवाद ):

export $(grep -v '^#' .env | xargs)

और यदि आप unsetफ़ाइल में परिभाषित सभी चर चाहते हैं , तो इसका उपयोग करें:

unset $(grep -v '^#' .env | sed -E 's/(.*)=.*/\1/' | xargs)

अपडेट करें:

रिक्त स्थान के साथ मानों को संभालने के लिए, उपयोग करें:

export $(grep -v '^#' .env | xargs -d '\n')

GNU सिस्टम पर - या:

export $(grep -v '^#' .env | xargs -0)

बीएसडी सिस्टम पर।


6
धन्यवाद, मुझे पसंद है कि यह फ़ाइल के लिए कुछ भी करने की आवश्यकता नहीं है - Foreman (Procfile) .env प्रारूप के साथ संगतता के लिए अनुमति देता है।
22

29
मैं इस समाधान के साथ आया: env $ (cat .env | xargs) रेल्स
गैब्रिएल

4
यह काम नहीं करता है अगर किसी भी एनवी मान में रिक्त स्थान हैं, हालांकि मैं वास्तव में निश्चित नहीं हूं कि रिक्त स्थान के साथ मूल्यों को निर्दिष्ट करने का सबसे अच्छा / वांछित तरीका क्या है। github.com/ddollar/foreman/issues/56 का कहना है कि इसे काम करना चाहिए export $(cat .env)लेकिन मुझे नहीं पता कि रिक्त स्थान के साथ यह कैसे किया जाए।
दान बेनामी

6
@BenjaminWheeler GNU linux में -dसीमांकक सेट करने के लिए है, इसलिए मैं कोशिश कर रहा हूं env $(cat .env | xargs -d '\n') rails, लेकिन यह अभी भी एक फ़ाइल के साथ त्रुटियां है अगर .envरिक्त स्थान नहीं है। किसी भी विचार क्यों यह काम नहीं करता है?
बैली पार्कर

19
यहाँ एक छोटा बदलाव हैeval $(cat .env) rails
15

412

-o allexportनिम्नलिखित सभी चर परिभाषाओं को निर्यात करने में सक्षम बनाता है। +o allexportइस सुविधा को अक्षम करता है।

set -o allexport
source conf-file
set +o allexport

9
एक जादू की तरह काम करता है! भले ही .envफाइल में कमेंट्स हों। धन्यवाद!
स्लाव फोमिन द्वितीय

9
और एक पंक्ति मेंset -o allexport; source conf-file; set +o allexport
हरमेलस्केलरेल

1
यह गुण फ़ाइल में पढ़ने का एक शानदार तरीका है, जब जेनकिंस EnvInject प्लग-इन काम नहीं करता है। धन्यवाद!
टेरेसा पीटर्स

21
@ CMCDragonkai, POSIX के लिए, यह होगा set -a; . conf-file; set +a
चार्ल्स डफी

3
यह विधि काम करती है यदि पर्यावरण चर में इसमें रिक्त स्थान हैं। दूसरों में से कई नहीं करते हैं। जबकि eval () विधि करता है, मैं भी eval का उपयोग करके थोड़ा
अजीब हो जाता हूं

137
set -a
. ./env.txt
set +a

अगर env.txtऐसा है:

VAR1=1
VAR2=2
VAR3=3
...

स्पष्टीकरण -ए, एलएक्सपोर्ट के बराबर है । दूसरे शब्दों में, शेल में प्रत्येक चर असाइनमेंट को पर्यावरण में निर्यात किया जाता है (कई बाल प्रक्रियाओं द्वारा उपयोग किया जाता है)। अधिक जानकारी सेट बिल्ड प्रलेखन में पाई जा सकती है :

-एक     प्रत्येक चर या फ़ंक्शन जो बनाया या संशोधित किया जाता है, निर्यात विशेषता दिया जाता है और बाद के आदेशों के वातावरण में निर्यात के लिए चिह्नित किया जाता है।

'+' के बजाय '+' का उपयोग करने से ये विकल्प बंद हो जाते हैं। विकल्प का उपयोग शेल के आह्वान पर भी किया जा सकता है। विकल्पों का वर्तमान सेट $ में मिल सकता है -।


क्या आप -a और + a समझा सकते हैं?
ओट्टो

11
@ ऑटो -aइसके बराबर है allexport। दूसरे शब्दों में, शेल में प्रत्येक चर असाइनमेंट exportपर्यावरण में (कई बच्चे प्रक्रियाओं द्वारा उपयोग किया जाने वाला) है। इस लेख को भी देखें gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
Dan Kowalczyk

33

allexportविकल्प अन्य उत्तर यहाँ है, जिसके लिए के एक जोड़े में बताया गया है set -aशॉर्टकट है। .Env की सोर्सिंग वास्तव में लाइनों पर लूपिंग करने और निर्यात करने से बेहतर है क्योंकि यह टिप्पणियों, रिक्त लाइनों और यहां तक ​​कि कमांड के लिए उत्पन्न पर्यावरण चर के लिए अनुमति देता है। मेरे .bashrc में निम्नलिखित शामिल हैं:

# .env loading in the shell
dotenv () {
  set -a
  [ -f .env ] && . .env
  set +a
}

# Run dotenv on login
dotenv

# Run dotenv on every new directory
cd () {
  builtin cd $@
  dotenv
}

3
यह अच्छा लग रहा है, लेकिन जब आप निर्देशिका छोड़ते हैं तो आप पर्यावरण चर को अनलोड करते हैं?
बैस्टियन वेंथुर

1
मैं चरों को परेशान नहीं करता, और यह कभी कोई समस्या नहीं रही। मेरे ऐप वैरिएबल नामों का उपयोग करते हैं जो अलग-अलग हैं, और अगर ओवरलैप है, तो मैं उन्हें उस .env के साथ रिक्त करने के लिए सेट करूँगा VAR=
gsf

26
eval $(cat .env | sed 's/^/export /')

1
उपयोग eval $(cat .env | sed 's/^[^$]/export /')करने से आपको बेहतर पठनीयता के लिए खाली लाइनें मिल सकती हैं।
मारियो उहैर

2
मुझे लगता है कि cat .env | sed 's/^[^$]/export /'प्रारंभिक चरित्र से स्ट्रिप्स। A=foo\nB=bar\nमुझे जो फ़ाइल मिलती है, उसके लिए export =foo\nexport =bar\n। यह खाली लाइनों को लंघन के लिए बेहतर काम करता है cat .env | sed '/^$/! s/^/export /':।
ओवेन एस।

(मैं UNIX कोड के उन गोल्फरों के लिए भी ध्यान देता हूं, जिनकी आपको catकिसी भी स्थिति में जरूरत नहीं है : eval $(sed 's/^/export /' .env)ठीक वैसे ही काम भी करता है।)
Owen S.

21

मैंने पाया कि सबसे कुशल तरीका है:

export $(xargs < .env)

व्याख्या

जब हमारे पास .envइस तरह की एक फ़ाइल होती है:

key=val
foo=bar

रन xargs < .envमिलेगाkey=val foo=bar

तो हम एक मिल जाएगा export key=val foo=bar और यह वही है जो हमें चाहिए!

सीमा

  1. यह उन मामलों को हैंडल नहीं करता है जहां मानों में रिक्त स्थान है। Env जैसे कमांड इस प्रारूप का निर्माण करते हैं। - @ शरद

3
यह उन मामलों को हैंडल नहीं करता है जहां मानों में रिक्त स्थान है। जैसे आदेशों envइस प्रारूप का उत्पादन।
शारजज

19

यहाँ एक और sedसमाधान है, जो स्पष्ट नहीं है या माणिक की आवश्यकता नहीं है:

source <(sed -E -n 's/[^#]+/export &/ p' ~/.env)

यह एक टिप्पणी के साथ शुरू होने वाली लाइनों पर टिप्पणियों को रखते हुए निर्यात जोड़ता है।

.env सामग्री

A=1
#B=2

नमूना चला

$ sed -E -n 's/[^#]+/export &/ p' ~/.env
export A=1
#export B=2

मुझे यह विशेष रूप से तब उपयोगी लगा जब एक सिस्टमड यूनिट फ़ाइलEnvironmentFile में लोड करने के लिए ऐसी फाइल का निर्माण किया गया


OSX में कई लाइनों को
सपोर्ट

17

मैंने user4040650 के उत्तर को अपवोट कर दिया है क्योंकि यह दोनों सरल है, और यह फ़ाइल में टिप्पणियों (अर्थात # से शुरू होने वाली लाइनें) की अनुमति देता है, जो कि मेरे लिए अत्यधिक वांछनीय है, क्योंकि चर को समझाने वाली टिप्पणियों को जोड़ा जा सकता है। मूल प्रश्न के संदर्भ में सिर्फ पुनर्लेखन।

यदि स्क्रिप्ट को संकेत के रूप में कहा जाता है: minientrega.sh prac1तो, minientrega.sh हो सकता है:

set -a # export all variables created next
source $1
set +a # stop exporting

# test that it works
echo "Ficheros: $MINIENTREGA_FICHEROS"

निम्नलिखित सेट प्रलेखन से निकाला गया था :

यह बिलिन इतनी जटिल है कि यह अपने स्वयं के खंड के योग्य है। सेट आपको शेल विकल्पों के मूल्यों को बदलने और स्थितीय मापदंडों को सेट करने, या शेल चर के नाम और मूल्यों को प्रदर्शित करने की अनुमति देता है।

सेट [--abefhkmnptuvxBCEHPT] [-o विकल्प-नाम] [तर्क ...] सेट [+ abefhkmnptuvxBCEHPT] [+ o विकल्प-नाम] [तर्क ...]

यदि कोई विकल्प या तर्क की आपूर्ति नहीं की जाती है, तो सेट सभी शेल चर और कार्यों के नाम और मूल्यों को प्रदर्शित करता है, जो वर्तमान स्थान के अनुसार सॉर्ट किया जाता है, जिसे वर्तमान में सेट किए गए चर को सेट या रीसेट करने के लिए इनपुट के रूप में पुन: उपयोग किया जा सकता है। केवल-पढ़ने योग्य चर को रीसेट नहीं किया जा सकता है। POSIX मोड में, केवल शेल चर सूचीबद्ध हैं।

जब विकल्प की आपूर्ति की जाती है, तो वे शेल विशेषताओं को सेट या अनसेट करते हैं। विकल्प, यदि निर्दिष्ट हो, तो निम्न अर्थ हैं:

-एक प्रत्येक चर या फ़ंक्शन जो बनाया या संशोधित किया जाता है, निर्यात विशेषता दिया जाता है और बाद के आदेशों के वातावरण में निर्यात के लिए चिह्नित किया जाता है।

और यह भी:

'+' के बजाय '+' का उपयोग करने से ये विकल्प बंद हो जाते हैं। विकल्प का उपयोग शेल के आह्वान पर भी किया जा सकता है। विकल्पों का वर्तमान सेट $ में मिल सकता है -।


14

सिलास पॉल के जवाब में सुधार

एक उपखंड पर चर निर्यात करना उन्हें कमांड के लिए स्थानीय बनाता है।

(export $(cat .env | xargs) && rails c)


फिर आप इसका उपयोग (set -a; source dev.env; set +a; rails c)सोर्सिंग के लाभ के लिए भी कर सकते हैं (जैसे स्क्रिप्ट निष्पादित कर सकते हैं)।
17

12

SAVE=$(set +o | grep allexport) && set -o allexport && . .env; eval "$SAVE"

यह आपके मूल विकल्पों को बचाएगा / पुनर्स्थापित करेगा, जो कुछ भी वे हो सकते हैं।

का उपयोग set -o allexportकर एक regex के बिना ठीक से लंघन टिप्पणी का लाभ है।

set +oअपने आप ही अपने सभी मौजूदा विकल्पों को एक प्रारूप में आउटपुट करता है, जो बाद में बैश कर सकता है। इसके अलावा काम: set -oअपने आप में, मानव-अनुकूल प्रारूप में आपके सभी मौजूदा विकल्पों को आउटपुट करता है।


2
मैं शायद exec env -i bashकॉल करने से पहले मौजूदा माहौल को साफ़ कर दूंगा evalयदि आपको उन वेरिएबल्स को अनसेट करने की ज़रूरत है जो केवल भीतर सेट हैं .env
b4hand

11

सबसे छोटा रास्ता मुझे मिला:

आपकी .envफ़ाइल:

VARIABLE_NAME="A_VALUE"

फिर बस

. ./.env && echo ${VARIABLE_NAME}

बोनस: क्योंकि यह एक छोटा लाइनर है, इसलिए यह package.jsonफ़ाइल में बहुत उपयोगी है

  "scripts": {
    "echo:variable": ". ./.env && echo ${VARIABLE_NAME}"
  }

यदि आपके पास बहुत सारे चर हैं तो कैसे होगा?
मेडो

@ आप जितनी चाहें उतनी पंक्तियाँ जोड़ सकते हैं, उसी तरह जैसे रेखाVARIABLE_NAME="A_VALUE"
Flavien Volken

9

सरल:

  1. फ़ाइल की सामग्री को पकड़ो
  2. किसी भी खाली लाइनों को हटा दें (बस आप कुछ सामान अलग कर दें)
  3. किसी भी टिप्पणी को हटा दें (बस आप कुछ जोड़ा है ...)
  4. exportसभी लाइनों में जोड़ें
  5. eval पूरी बात

eval $(cat .env | sed -e /^$/d -e /^#/d -e 's/^/export /')

एक अन्य विकल्प (आपको eval@ जयदीप के लिए धन्यवाद) दौड़ना नहीं है :

export $(cat .env | sed -e /^$/d -e /^#/d | xargs)

अंत में, यदि आप अपने जीवन को आसान बनाना चाहते हैं, तो इसे अपने साथ जोड़ें ~/.bash_profile:

function source_envfile() { export $(cat $1 | sed -e /^$/d -e /^#/d | xargs); }

(यह सुनिश्चित करें कि आप अपने कैश सेटिंग्स से मेल खाते हैं !!! source ~/.bash_profileया .. बस एक नया टैब / विंडो और समस्या हल करें) आप इसे इस तरह कहते हैं:source_envfile .env


2
मुझे पाइपलाइन के लिए गिटलैब गुप्त चर से .env पाठ पढ़ना था: आपके समाधान के आधार पर इस कमांड ने मेरे लिए काम किया source <( echo $(sed -E -n 's/[^#]+/ &/ p' <(echo "${2}" | tr -d '\r')) );:। किसी तरह गिट्लाब एक खिड़कियों की वापसी के साथ गुप्त चर बचाता है, इसलिए मुझे इसके साथ ट्रिम करना पड़ा tr -d '\r'
मेटानर्ड

6

आप चर सेट करने के लिए अपनी मूल स्क्रिप्ट का उपयोग कर सकते हैं, लेकिन आपको इसे निम्नलिखित तरीके से कॉल करना होगा (स्टैंड-अलोन डॉट के साथ):

. ./minientrega.sh

इसके अलावा cat | while readदृष्टिकोण के साथ एक मुद्दा हो सकता है । मैं दृष्टिकोण का उपयोग करने की सलाह दूंगा while read line; do .... done < $FILE

यहाँ एक काम कर उदाहरण है:

> cat test.conf
VARIABLE_TMP1=some_value

> cat run_test.sh
#/bin/bash
while read line; do export "$line";
done < test.conf
echo "done"

> . ./run_test.sh
done

> echo $VARIABLE_TMP1
some_value

अधिकांश अन्य उत्तरों के विपरीत, यह समाधान test.confस्क्रिप्ट फ़ाइल के रूप में विकसित नहीं होता है । यह बेहतर बनाता है। जब तक आपको वास्तव में इसकी आवश्यकता न हो, तब तक स्क्रिप्टिंग की अनुमति नहीं देना सुरक्षित है, खासकर अगर किसी को एहसास नहीं है कि क्या चल रहा है (या भूल जाता है)।
meustrus

5

अन्य उत्तरों पर निर्माण, यहाँ एक फ़ाइल में लाइनों का केवल सबसेट निर्यात करने का एक तरीका है, जिसमें रिक्त स्थान जैसे मान शामिल हैं PREFIX_ONE="a word":

set -a
. <(grep '^[ ]*PREFIX_' conf-file)
set +a

5

यहाँ मेरा संस्करण है:

  with_env() {
    (set -a && . ./.env && "$@")
  }

पिछले समाधानों की तुलना में:

  • यह बाहर के दायरे में वेरिएबल को लीक नहीं करता है (मान .envकॉलर से उजागर नहीं होते हैं)
  • क्लोबर setविकल्प नहीं है
  • निष्पादित कमांड का निकास कोड देता है
  • संगत का उपयोग करता है set -a
  • का उपयोग करता है .के बजाय sourceबचने bashism को
  • यदि .envलोडिंग विफल रहता है, तो कमांड को आमंत्रित नहीं किया जाता है
with_env rails console

आप इनलाइन भी चला सकते हैं (चर आपके मौजूदा टर्मिनल सत्र के संपर्क में हैं): set -a && . ./.env && "$@" && echo "your comand here"
जियोवैन अफोंसो

4

मैं .envमैक पर डॉक-कम्पोज़ और फाइलों के साथ काम करता हूं , और .envअपने बैश शेल (परीक्षण के लिए) में आयात करना चाहता था , और यहां "सबसे अच्छा" उत्तर निम्नलिखित चर पर ट्रिपिंग कर रहा था:

.env

NODE_ARGS=--expose-gc --max_old_space_size=2048

समाधान

इसलिए मैंने evalएकल उद्धरणों में अपने env var defs का उपयोग करके , और समाप्त कर लिया ।

eval $(grep -v -e '^#' .env | xargs -I {} echo export \'{}\')

बैश संस्करण

$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.


2

मेरे पास पहले सुझाए गए समाधानों के साथ समस्याएँ हैं:

  • @ शुभ के समाधान से बैश फ्रेंडली कॉन्फ़िगरेशन फ़ाइलों को बहुत तेजी से परेशान किया जाता है, और यह भी - आप हमेशा अपने कॉन्फ़िगरेशन को निर्यात नहीं करना चाहते हैं।
  • @ सिलसिला पॉल समाधान तब टूटता है जब आपके पास वे चर होते हैं जिनमें रिक्त स्थान या अन्य वर्ण होते हैं जो उद्धृत मूल्यों में अच्छी तरह से काम करते हैं, लेकिन $()एक गड़बड़ करते हैं।

यहाँ मेरा समाधान है, जो अभी भी बहुत भयानक IMO है - और सिलास द्वारा संबोधित "केवल एक बच्चे को निर्यात" समस्या को हल नहीं करता है (हालांकि आप गुंजाइश को सीमित करने के लिए शायद इसे उप-शेल में चला सकते हैं):

source .conf-file
export $(cut -d= -f1 < .conf-file)

2

मेरी आवश्यकताएं थीं:

  • exportउपसर्ग के बिना सरल .env फ़ाइल (dotenv के साथ संगतता के लिए)
  • उद्धरण में समर्थन मूल्य: TEXT = "अल्फ़ा ब्रावो चार्ली"
  • सहायक टिप्पणियों # और खाली लाइनों के साथ उपसर्ग
  • मैक / BSD और linux / GNU दोनों के लिए सार्वभौमिक

ऊपर दिए गए उत्तरों से संकलित पूर्ण कार्य संस्करण:

  set -o allexport
  eval $(grep -v '^#' .env | sed 's/^/export /')
  set +o allexport

1
यदि आप "निर्यात" के साथ वैसे भी "-ओ अल्लेक्सपोर्ट" का क्या मतलब है?
इल -

2

सबसे पहले, एक पर्यावरण फ़ाइल बनाएं जिसमें नीचे की तरह वातावरण की सभी कुंजी-मूल्य जोड़ी होगी और मेरे मामले में आपको जो भी पसंद है उसका नाम env_var.env

MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt programa.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"

फिर एक स्क्रिप्ट बनाएं जो नीचे की तरह अजगर पर्यावरण के लिए सभी पर्यावरण चर निर्यात करेगा और इसे जैसा नाम देगा export_env.sh

#!/usr/bin/env bash

ENV_FILE="$1"
CMD=${@:2}

set -o allexport
source $ENV_FILE
set +o allexport

$CMD

यह स्क्रिप्ट पर्यावरण फ़ाइल के रूप में पहला तर्क लेगी फिर उस फ़ाइल में सभी पर्यावरण चर निर्यात करें और फिर उसके बाद कमांड चलाएँ।

उपयोग:

./export_env.sh env_var.env python app.py

1

मैं इस धागे के पार आया था जब मैं --env-fileएक गोले में डॉकर के पुन: उपयोग की कोशिश कर रहा था । उनका प्रारूप बैश संगत नहीं है, लेकिन यह सरल है: name=valueकोई उद्धरण नहीं, कोई प्रतिस्थापन नहीं। वे खाली लाइनों को भी नजरअंदाज करते हैं# टिप्पणियों को ।

मैं इसे पॉज़िक्स के अनुकूल नहीं पा सका, लेकिन यहाँ एक है जो बैश जैसे गोले में काम करना चाहिए (OSX 10.12.5 पर zsh में परीक्षण किया गया और Ubuntu 14.04 पर बैश किया गया):

while read -r l; do export "$(sed 's/=.*$//' <<<$l)"="$(sed -E 's/^[^=]+=//' <<<$l)"; done < <(grep -E -v '^\s*(#|$)' your-env-file)

यह ऊपर दिए गए डॉक्स से उदाहरण में तीन मामलों को संभाल नहीं करेगा :

  • bash: export: `123qwe=bar': not a valid identifier
  • bash: export: `org.spring.config=something': not a valid identifier
  • और यह पस्चथ्रू सिंटैक्स (एक नंगे FOO) को नहीं संभालेगा

1

मूल्य में सफेद स्थान

यहाँ कई शानदार उत्तर हैं, लेकिन मैंने उन सभी को मूल्य में सफेद स्थान के लिए समर्थन की कमी के कारण पाया:

DATABASE_CLIENT_HOST=host db-name db-user 0.0.0.0/0 md5

मुझे 2 समाधान मिले हैं जो खाली लाइनों और टिप्पणियों के समर्थन के साथ ऐसे मूल्यों को काम करते हैं।

एक sed और @ javier-buzzi उत्तर पर आधारित :

source <(sed -e /^$/d -e /^#/d -e 's/.*/declare -x "&"/g' .env)

और @ john1024 उत्तर के आधार पर एक लूप में रीड लाइन है

while read -r line; do declare -x "$line"; done < <(egrep -v "(^#|^\s|^$)" .env)

यहाँ कुंजी declare -xदोहरे उद्धरण चिह्नों का उपयोग करने और डालने में है। मुझे पता नहीं क्यों, लेकिन जब आप लूप कोड को कई लाइनों में सुधारते हैं तो यह काम नहीं करेगा - मैं कोई बैश प्रोग्रामर नहीं हूं, मैं बस एक साथ इन पर ध्यान देता हूं, यह अभी भी मेरे लिए जादू है :)


1
मुझे sedइसे काम करने के लिए समाधान को संशोधित करना पड़ा । लेकिन पहले कुछ स्पष्टीकरण: के -eलिए कम है --expression, जो बताता है sedकि क्या ऑपरेशन करना है। -e /^$/dआउटपुट से खाली लाइनें हटाता है (फ़ाइल नहीं)। -e /^#/dआउटपुट से बैश टिप्पणियां (# से शुरू होने वाली रेखाएं) हटाता है। 's/.*/declare -x "&"/g'शेष लाइनों की जगह (विकल्प) declare -x "ENV_VAR="VALUE""। जब आप इसे स्रोत करते हैं, तो कम से कम मेरे लिए, यह काम नहीं करता था। इसके बजाय, मुझे source <(sed -e /^$/d -e /^#/d -e 's/.*/declare -x &/g' .env)अतिरिक्त "आवरण को हटाने के लिए उपयोग करना पड़ा ।
jcasner

मैं .env फ़ाइल के उद्धरण के बिना ENV_VAR="lorem ipsum", मेरे पास उपयोग नहीं है ENV_VAR=lorem ipsum। अब मुझे यकीन नहीं है कि क्यों, लेकिन यह शायद अन्य उपकरणों में समस्याग्रस्त था जो इस फ़ाइल को पार्स करता है। और इसके बजाय lorem ipsumमैं "lorem ipsum"मूल्य के साथ समाप्त हो गया है - उद्धरण के साथ। स्पष्टीकरण के लिए Thx :)
Janusz Skonieczny

1
यदि यह मेरी पसंद थी, तो मैं भी उपयोग नहीं करूंगा ENV_VAR="lorem ipsum"। मेरे उपयोग के मामले में, मेरा होस्टिंग प्रदाता इस फ़ाइल को मेरे द्वारा सेट किए गए कुछ कॉन्फ़िगरेशन विकल्पों के आधार पर जेनरेट करता है, और वे दोहरे कोट्स को सम्मिलित करते हैं। इसलिए, मैं इसके आसपास काम करने के लिए मजबूर हूं। यहाँ आपकी मदद के लिए धन्यवाद - मुझे sedखुद को सही विकल्पों में से निकालने की कोशिश में बहुत समय बचा लिया !
jcasner

1

कुछ इस तरह की कोशिश करो

for line in `cat your_env_file`; do if [[ $line != \#* ]];then export $line; fi;done

1
t=$(mktemp) && export -p > "$t" && set -a && . ./.env && set +a && . "$t" && rm "$t" && unset t

यह काम किस प्रकार करता है

  1. अस्थायी फ़ाइल बनाएँ।
  2. अस्थायी फ़ाइल के लिए सभी वर्तमान परिवेश चर मान लिखें।
  3. स्रोत स्क्रिप्ट में सभी घोषित चर के निर्यात को पर्यावरण में सक्षम करें।
  4. .envफ़ाइल पढ़ें । सभी चर वर्तमान परिवेश में निर्यात किए जाएंगे।
  5. स्रोत स्क्रिप्ट में पर्यावरण के लिए सभी घोषित चर का निर्यात अक्षम करें।
  6. अस्थायी फ़ाइल की सामग्री पढ़ें। प्रत्येक पंक्ति में ऐसा होगा जो declare -x VAR="val"प्रत्येक चर को पर्यावरण में निर्यात करेगा।
  7. अस्थायी फ़ाइल निकालें।
  8. वैरिएबल होल्डिंग अस्थायी फ़ाइल नाम को खोलें।

विशेषताएं

  • पर्यावरण में पहले से ही निर्धारित चर के मूल्यों को संरक्षित करता है
  • .env टिप्पणी कर सकते हैं
  • .env खाली लाइनें हो सकती हैं
  • .envअन्य जवाबों की तरह विशेष शीर्ष लेख या पाद लेख की आवश्यकता नहीं है ( set -aऔरset +a ) की
  • .envexportहर मूल्य के लिए की आवश्यकता नहीं है
  • एक लाइन

0

यदि आपको कोई त्रुटि हो रही है क्योंकि आपके किसी चर में एक मान है जिसमें सफेद स्थान हैं, तो आप निष्पादन के लिए मानकों की एक सूची के रूप में परिणाम की व्याख्या करने के लिए bash IFS(आंतरिक क्षेत्र विभाजक) को रीसेट करने का प्रयास कर सकते हैं ।\ncat .envenv

उदाहरण:

IFS=$'\n'; env $(cat .env) rails c

यह सभी देखें:


0

मेरी .env फ़ाइल इस प्रकार है:

DATABASE_URI="postgres://sa:***@localhost:5432/my_db"
VARIABLE_1="SOME_VALUE"
VALIABLE_2="123456788"

@Henke के तरीकों का उपयोग करके , निर्यात किया गया मान उद्धरण चिह्नों से युक्त होता है"

"postgres://sa:***@localhost:5432/my_db"
"SOME_VALUE"
"123456788"

लेकिन मैं चाहता हूँ कि निर्यात मूल्य में केवल शामिल हैं:

postgres://sa:***@localhost:5432/my_db
SOME_VALUE
123456788

इसे ठीक करने के लिए, मैं उद्धरण चिह्नों को हटाने के लिए कमांड को संपादित करता हूं:

export $(grep -v '^#' dev.env | tr --delete '"' | xargs -d '\n')

0

यह एक आरएचएस पर रिक्त स्थान के साथ मुकाबला करता है, और 'अजीब' vars को स्केच करता है जैसे bash मॉड्यूल की परिभाषाएँ (उनमें '') के साथ):

echo "# source this to set env vars" > $bld_dir/.env
env | while read line; do
    lhs="${line%%=*}"
    rhs="${line#*=}"
    if [[ "$lhs" =~ ^[0-9A-Za-z_]+$ ]]; then
        echo "export $lhs=\"$rhs\"" >> $bld_dir/.env
    fi
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.