কী / মান জোড়ার ফাইল থেকে পরিবেশের ভেরিয়েবল সেট করুন


511

টিএল; ডিআর: কীভাবে আমি শেল পরিবেশে কোনও পাঠ্য ফাইল থেকে কী / মান জোড়ের সেট রপ্তানি করব?


রেকর্ডের জন্য, নীচে উদাহরণগুলির সাথে প্রশ্নের মূল সংস্করণ।

আমি ব্যাশে একটি স্ক্রিপ্ট লিখছি যা একটি নির্দিষ্ট ফোল্ডারে 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
সিরো Santilli郝海东冠状病六四事件法轮功

এটি একটি দুর্দান্ত প্রশ্ন তবে নির্দিষ্ট ভেরিয়েবল নামের ("MINIENTREGA_FECHALIMITE"? এর অর্থ কী?) এবং সংখ্যাগুলি (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
চিপনার

4
এবং যদি এটি কোনও ফাইল থেকে আসে না,< <(commands that generate output)
o11c

5
আপনার আরও পরিষ্কার সমাধান আছে , আমার কাছে একটি পছন্দ রয়েছেset -o allexport
হেরালাইট

2
যদি সিস্টেমগুলির মধ্যে এই .env ফাইলটি ব্যবহার করা হয় তবে সন্নিবেশ করা exportজাভা,
সিস্টেমডি

1
awk '{print "export " $0}' envfileপ্রতিটি লাইনের শুরুতে রফতানি
আটকে দেওয়ার সুবিধে

887

এটি সহায়ক হতে পারে:

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

আমি যদি .envআমার রেল কনসোলের স্টাফ পরীক্ষা করতে চাই তবে আমি কেন এটি ব্যবহার করার কারণ ।

ভেরিয়েবলগুলি স্থানীয় রাখার জন্য গ্যাব্রিলফ একটি ভাল উপায় নিয়ে এসেছিল। প্রকল্প থেকে প্রকল্পে যাওয়ার সময় এটি সম্ভাব্য সমস্যা সমাধান করে।

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')

জিএনইউ সিস্টেমে - বা:

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

বিএসডি সিস্টেমে


6
ধন্যবাদ, আমি পছন্দ করি যে এটির জন্য কোনও ফাইলের প্রিপেন্ডিংয়ের দরকার নেই - ফোরম্যান (প্রোকফিল) .এনভি ফর্ম্যাটের সাথে সামঞ্জস্য করার অনুমতি দেয়।
natevw

29
আমি সমাধানটি নিয়ে এসেছি: env $ (cat .env | xargs) Rails
গ্যাব্রিল্ফ

4
এনভির মানগুলির কোনওটির যদি ফাঁকা স্থান থাকে তবে এটি কাজ করবে না বলে মনে হচ্ছে, যদিও আমি স্পেসের সাথে মানগুলি নির্দিষ্ট করার সর্বোত্তম / পছন্দসই উপায়টি আসলে নিশ্চিত না sure github.com/ddollar/foreman/issues/56 বলছেন এটির মতো কাজ করা উচিত export $(cat .env)তবে স্পেসগুলির সাথে কীভাবে এই চুক্তি করতে হয় তা আমি জানি না।
ড্যান বেনামি

6
@ বেনজামিনহিলার জিএনইউ লিনাক্স -dডিলিমিটার সেট করার জন্য রয়েছে , তাই আমি চেষ্টা করছি env $(cat .env | xargs -d '\n') rails, তবে এটি .envফাঁকা থাকলেও একটি ফাইল খুঁজে না পেয়ে ত্রুটি করে । কোন ধারণা কেন এটি কাজ করে না?
বেইলি পার্কার

19
এখানে একটি সংক্ষিপ্ত প্রকরণ রয়েছেeval $(cat .env) rails
মানালং

412

-o allexportরফতানি করতে নিম্নলিখিত সমস্ত পরিবর্তনশীল সংজ্ঞা সক্ষম করে। +o allexportএই বৈশিষ্ট্যটি অক্ষম করে।

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

9
একটি যাদুমন্ত্র মত কাজ করে! এমনকি .envফাইলটিতে মন্তব্য থাকলেও । ধন্যবাদ!
স্লাভা ফমিন II

9
এবং এক লাইনেset -o allexport; source conf-file; set +o allexport
হার্লেমস্পুইরেল

1
কোনও প্রপার্টি ফাইলে পড়ার জন্য এটি দুর্দান্ত উপায়, যখন জেনকিনস এনভিনিজেক্ট প্লাগ-ইন কাজ করে না। ধন্যবাদ!
তেরেসা পিটারস

21
@ পিসিক্সের জন্য, সিএমসিডিগ্রাগনকাই, এটি হবে set -a; . conf-file; set +a
চার্লস ডাফি

3
এই পদ্ধতিটি কার্যকর হয় যদি পরিবেশের ভেরিয়েবলের মধ্যে স্পেস থাকে। অন্যদের অনেকেই তা করেন না। যদিও ইওল () পদ্ধতিটি করে, আমি
ইওল

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

যদি env.txtমত হয়:

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

ব্যাখ্যা- একটি অ্যালেক্সপোর্টের সমতুল্য । অন্য কথায় শেলের প্রতিটি চলক কার্য পরিবেশে রফতানি করা হয় (একাধিক শিশু প্রক্রিয়া দ্বারা ব্যবহৃত হতে পারে) to সেট বিল্টিন ডকুমেন্টেশনে আরও তথ্য পাওয়া যাবে :

-a     প্রতিটি পরিবর্তনশীল বা ফাংশন যা তৈরি বা সংশোধিত হয় সেগুলি রফতানি বৈশিষ্ট্য দেওয়া হয় এবং পরবর্তী কমান্ডগুলির পরিবেশে রফতানির জন্য চিহ্নিত করা হয়।

'-' এর পরিবর্তে '+' ব্যবহারের ফলে এই বিকল্পগুলি বন্ধ হয়ে যায়। শেলটি আহ্বানের পরেও বিকল্পগুলি ব্যবহার করা যেতে পারে। বিকল্পগুলির বর্তমান সেটটি $ - এ পাওয়া যেতে পারে।


আপনি -এ এবং + এ ব্যাখ্যা করতে পারেন?
অটো

11
@ অট্টোর -aসমতুল্য allexport। অন্য কথায়, শেলের প্রতিটি পরিবর্তনশীল কার্য exportপরিবেশে সম্পাদিত হয় (একাধিক শিশু প্রক্রিয়া দ্বারা ব্যবহৃত হতে পারে)। এছাড়াও এই নিবন্ধটি দেখুন gnu.org/software/bash/manual/html_node/The-Set- বুলেটিন এইচটিএমএল
ড্যান

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
আমি ভেরিয়েবলগুলি আনসেট করি না এবং এটি কখনও সমস্যা হয়নি। আমার অ্যাপ্লিকেশনগুলিতে পৃথক পৃথক পৃথক নামগুলি ব্যবহার করার প্রবণতা রয়েছে এবং যদি ওভারল্যাপ থাকে তবে আমি এগুলি 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 /'
ওভেন এস।

(আমি ইউনিক্স কোড গল্ফারদের জন্যও লক্ষ করি যে আপনার catকোনও ক্ষেত্রেই প্রয়োজন নেই : eval $(sed 's/^/export /' .env)ঠিক তেমন কাজ করে))
ওভেন এস।

21

আমি সবচেয়ে কার্যকর উপায় খুঁজে পেয়েছি:

export $(xargs < .env)

ব্যাখ্যা

যখন আমাদের কাছে .envএই জাতীয় ফাইল থাকে:

key=val
foo=bar

রান xargs < .envপেতে হবেkey=val foo=bar

সুতরাং আমরা একটি পেতে export key=val foo=barএবং এটি আমাদের প্রয়োজন ঠিক কি!

সীমাবদ্ধতা

  1. এটি মানগুলির মধ্যে ফাঁকা স্থান রয়েছে এমন ক্ষেত্রে এটি পরিচালনা করে না। এনভির মতো কমান্ডগুলি এই ফর্ম্যাটটি তৈরি করে। - @ শারজ

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 লোড করার জন্য যেমন একটি ফাইল তৈরি করার সময় আমি এটি বিশেষভাবে দরকারী বলে মনে করেছি


ওএসএক্সে একাধিক লাইন সরবরাহ করে না
আবডেন্নার TOUMI

17

আমি ব্যবহারকারীর 4040650 এর উত্তরকে সমর্থন করেছি কারণ এটি উভয়ই সহজ, এবং এটি ফাইলটিতে মন্তব্যগুলির অনুমতি দেয় (অর্থাত্ # দিয়ে শুরু করা লাইনগুলি), যা আমার পক্ষে অত্যন্ত কাম্য, কারণ ভেরিয়েবলগুলি ব্যাখ্যা করার মত মন্তব্য যুক্ত করা যেতে পারে। কেবল আসল প্রশ্নের প্রসঙ্গে পুনরায় লেখা।

যদি স্ক্রিপ্টটি নির্দেশিত হিসাবে কল করা হয়:, minientrega.sh prac1তবে মিনিয়ানরেগা.শ থাকতে পারে:

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

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

নিম্নলিখিত সেট ডকুমেন্টেশন থেকে নিষ্কাশন করা হয়েছিল :

এই বিল্টিনটি এত জটিল যে এটি তার নিজস্ব বিভাগের দাবি রাখে। সেট আপনাকে শেল বিকল্পগুলির মান পরিবর্তন করতে এবং অবস্থানগত পরামিতিগুলি সেট করতে বা শেল ভেরিয়েবলের নাম ও মান প্রদর্শন করতে দেয়।

সেট [--abefhkmnptuvxBCEHPT] [-o বিকল্প-নাম] [যুক্তি…] সেট [+ abefhkmnptuvxBCEHPT] [+ ও বিকল্প নাম] [যুক্তি…]

যদি কোনও বিকল্প বা আর্গুমেন্ট সরবরাহ না করা হয় তবে বর্তমান শৈল ভেরিয়েবল এবং ফাংশনগুলির নাম এবং মানগুলি বর্তমান লোকেল অনুসারে বাছাই করা ফর্ম্যাটে সেট করে যা বর্তমানে-সেট ভেরিয়েবলগুলি সেট বা পুনরায় সেট করার জন্য ইনপুট হিসাবে পুনরায় ব্যবহার করা যেতে পারে। কেবল পঠনযোগ্য ভেরিয়েবলগুলি পুনরায় সেট করা যাবে না। পসিক্স মোডে কেবল শেল ভেরিয়েবল তালিকাভুক্ত হয়।

বিকল্প সরবরাহ করা হয়, তারা শেল বৈশিষ্ট্য সেট বা আনসেট। বিকল্পগুলি যদি নির্দিষ্ট করা থাকে তবে নিম্নলিখিত অর্থগুলি থাকে:

-a প্রতিটি পরিবর্তনশীল বা ফাংশন যা তৈরি বা সংশোধিত হয় সেগুলি রফতানি বৈশিষ্ট্য দেওয়া হয় এবং পরবর্তী কমান্ডগুলির পরিবেশে রফতানির জন্য চিহ্নিত করা হয়।

এবং এটি পাশাপাশি:

'-' এর পরিবর্তে '+' ব্যবহারের ফলে এই বিকল্পগুলি বন্ধ হয়ে যায়। শেলটি আহ্বানের পরেও বিকল্পগুলি ব্যবহার করা যেতে পারে। বিকল্পগুলির বর্তমান সেটটি $ - এ পাওয়া যেতে পারে।


14

সিলাস পলের উত্তরের উন্নতি

ভেরিয়েবলগুলি একটি সাব-শেলের মাধ্যমে এক্সপোর্ট করে তাদের কমান্ডে স্থানীয় করে তোলে।

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


তারপরে আপনি এটি ব্যবহার করে (set -a; source dev.env; set +a; rails c)সোর্সিংয়ের সুবিধা পেতে পারেন (উদাহরণস্বরূপ স্ক্রিপ্টটি কার্যকর করতে পারে)।
ওয়াচা

12

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

এটি আপনার আসল বিকল্পগুলি, সে যাই হোক না কেন সেভ / পুনরুদ্ধার করবে।

ব্যবহার set -o allexport রেজিক্স ছাড়াই মন্তব্যগুলি যথাযথভাবে এড়িয়ে যাওয়ার সুবিধা রয়েছে।

set +oনিজেই আপনার বর্তমান বিকল্পগুলি এমন ফর্ম্যাটে আউটপুট করে যা বাশ পরে চালাতে পারে। এছাড়াও সহজ: set -oনিজে থেকে, আপনার বর্তমান বিকল্পগুলি মানব-বান্ধব বিন্যাসে আউটপুট করে।


2
আমি আপনাকে exec env -i bashকল করার আগে বিদ্যমান পরিবেশটি পরিষ্কার evalকরতে চাই যদি আপনি কেবলমাত্র এর মধ্যে সেট করে থাকা ভেরিয়েবলগুলি আনসেট করতে চান .env
বি

11

আমি সবচেয়ে সংক্ষিপ্ততম উপায়টি খুঁজে পেয়েছি:

আপনার .envফাইল:

VARIABLE_NAME="A_VALUE"

তারপর ঠিক

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

বোনাস: এটি একটি সংক্ষিপ্ত ওয়ান-লাইনার হওয়ায় এটি package.jsonফাইলটিতে খুব দরকারী

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

আপনার যদি প্রচুর ভেরিয়েবল থাকে তবে কীভাবে?
ম্যাডেও

@ ম্যাডেও আপনি যতটা লাইন চান তার সাথে লাইনও ঠিক একইভাবে যুক্ত করতে পারেনVARIABLE_NAME="A_VALUE"
ফ্ল্যাভিয়ান ভলকেন

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
আমি একটি পাইপলাইন জন্য gitlab গোপন পরিবর্তনশীল থেকে .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বিকল্প নেই
  • এক্সিকিউটড কমান্ডের প্রস্থান কোড ফেরৎ দেয়
  • সামঞ্জস্যপূর্ণ posix ব্যবহার করে set -a
  • বাশিজম এড়ানোর .পরিবর্তে ব্যবহার করেsource
  • .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, এবং একক উক্তিগুলিতে আমার এনভেরি ভেরি ডিএফগুলি মোড়ানো।

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

আমার পূর্বে প্রস্তাবিত সমাধানগুলির সাথে সমস্যাগুলি রয়েছে:

  • @ অনুভার সমাধানটি ব্যাশ বান্ধব কনফিগারেশন ফাইলগুলি খুব দ্রুত বিরক্তিকর করে তোলে, এবং - আপনি সর্বদা আপনার কনফিগারেশনটি রপ্তানি করতে নাও চান।
  • @ সিলাস পল সলিউশনটি ভেঙে গেলে আপনার যখন ভেরিয়েবলগুলি রয়েছে যেখানে স্পেস রয়েছে বা অন্যান্য অক্ষর রয়েছে যা উদ্ধৃত মানগুলিতে ভাল কাজ করে তবে $()একটি গোলমাল হয়।

এটি আমার সমাধান, যা এখনও বেশ ভয়াবহ আইএমও - এবং সিলাস সম্বোধিত "কেবলমাত্র একটি সন্তানের কাছে রফতানি" সমস্যার সমাধান করে না (যদিও আপনি সম্ভবত সুযোগটি সীমাবদ্ধ করতে সাব-শেল এ চালাতে পারেন):

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

2

আমার প্রয়োজনীয়তাগুলি ছিল:

  • সহজ .env ফাইল ছাড়া exportপ্রিফিক্স (ডটেনভের সাথে সামঞ্জস্যের জন্য)
  • উদ্ধৃতিগুলিতে সমর্থনকারী মান: TEXT = "আলফা ব্রাভো চার্লি"
  • # এবং খালি লাইনের সাথে উপসর্গ করা মন্তব্যগুলিকে সমর্থন করছে
  • ম্যাক / বিএসডি এবং লিনাক্স / জিএনইউ উভয়ের জন্য সর্বজনীন

উপরের উত্তরগুলি থেকে সংকলিত পূর্ণ কার্যকারী সংস্করণ:

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

1
আপনি যদি কোনওভাবে "রফতানি" দিয়ে প্রেন্ডিং করেন তবে "-o অ্যালেক্সপোর্ট" এর বিন্দু কী?
ইল - ইয়া

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:, কোনও উদ্ধৃতি নেই, কোনও বিকল্প নেই। তারা ফাঁকা লাইন এবং #মন্তব্য উপেক্ষা করে ।

আমি এটি বেশ সামঞ্জস্যপূর্ণভাবে পিক্স করতে পারিনি, তবে এখানে এমন একটি যা বাশ-জাতীয় শেলগুলিতে কাজ করা উচিত (ওএসএক্স 10.12.5-তে জেডএস-এ পরীক্ষিত এবং উবুন্টু 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 টি সমাধান খুঁজে পেয়েছি যা খালি লাইন এবং মন্তব্যের জন্য এই জাতীয় মানগুলির সাথে কাজ করে।

সেড এবং @ জাভিয়ের-বুজি উত্তরের উপর ভিত্তি করে একটি :

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

এবং @ জন 1024 উত্তরের উপর ভিত্তি করে একটি লুপে পঠনের লাইনের সাথে একটি one

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"মান দিয়ে শেষ হয়েছে - উদ্ধৃতি সহ। ব্যাখ্যার জন্য
থেক্স

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

যদি আপনি একটি ত্রুটি পেয়ে থাকেন কারণ আপনার ভেরিয়েবলগুলির মধ্যে একটিতে এমন একটি মান রয়েছে যাতে সাদা স্পেস থাকে আপনি বাশকে IFS(অভ্যন্তরীণ ক্ষেত্র বিভাজক) এক্সিকিউটিয়েবলের জন্য প্যারামিটারগুলির তালিকা হিসাবে ফলাফলটি \nব্যাখ্যা করতে দিতে পুনরায় সেট করার চেষ্টা করতে পারেন ।cat .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"

@ হেনকের উপায়গুলি ব্যবহার করে, রফতানির মানটি উদ্ধৃতি চিহ্নগুলি সমাপ্ত করে"

"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

এটি আরএইচএসে ফাঁকা জায়গাগুলির সাথে অনুলিপি করে এবং 'অদ্ভুত' ভারগুলি এড়িয়ে যায় যেমন বাশ মডিউল সংজ্ঞা (তাদের মধ্যে '()' সহ):

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.