কিভাবে একটি ফাইল থেকে ভেরিয়েবল রফতানি?


78

আমার কাছে tmp.txtরফতানি করতে ভেরিয়েবলযুক্ত একটি ফাইল রয়েছে, উদাহরণস্বরূপ:

a=123
b="hello world"
c="one more variable"

exportকমান্ডটি ব্যবহার করে আমি কীভাবে এই সমস্ত পরিবর্তনশীলগুলি রফতানি করতে পারি , যাতে সেগুলি পরে শিশু প্রক্রিয়াগুলির দ্বারা ব্যবহার করা যায়?


1
bash --init-file somefile.blah -c "কমান্ড"
ডিলিয়ান মার্পে

আপনি ডিরেক্টরিতে যখন ফাইলগুলি স্বয়ংক্রিয়ভাবে উত্স করবেন সে.env সম্পর্কে এসও এর একটি দরকারী উত্তর রয়েছে cd
ড্যান ড্যাসক্লেস্কু

@ নীরভ দয়া করে অন্য উত্তরটি গ্রহণ করুন। এটি একটি আরও ভাল সমাধান।
কোডারডুড

উত্তর:


64
source tmp.txt
export a b c
./child ...

আপনার অন্য প্রশ্নের দ্বারা বিচার করে আপনি ভেরিয়েবলের নামগুলি হার্ডকোড করতে চান না:

source tmp.txt
export $(cut -d= -f1 tmp.txt)

এটা পরীক্ষা করো:

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable

2
উদাহরণস্বরূপ, এনভায়রনমেন্ট ফাইলে মন্তব্য থাকলে এটি কাজ করবে না। (উদাহরণস্বরূপ, ফাইলগুলি যা সিস্টেমেড এনভায়রনমেন্ট ফাইল দ্বারা পুনরায় ব্যবহার করা যেতে পারে)
ক্রিস ল্যাম্ব

3
@ChrisLamb আপনি ব্যবহার করতে পারেন grep: মন্তব্যগুলি এড়িয়ে যেতেexport $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee

180
set -a
. ./tmp.txt
set +a

set -aভেরিয়েবলগুলি তৈরি করে - এখন থেকে সংজ্ঞায়িত হয়ে স্বয়ংক্রিয়ভাবে রফতানি হবে। এটি কোনও বোর্নের মতো শেলটিতে পাওয়া যায়। কমান্ডের .মান এবং বোর্ন নাম sourceতাই আমি এটি পোর্টিবিলিটির জন্য পছন্দ করি ( sourceআসে cshএবং এখন বেশিরভাগ আধুনিক বোর্নের মতো শেলগুলিতে পাওয়া যায় bashযদিও (কখনও কখনও কিছুটা ভিন্ন আচরণ সহ))।

পসিক্স শেলগুলিতে, আপনি set -o allexportএটি লেখার জন্য আরও বর্ণনামূলক বিকল্প উপায় হিসাবে ( set +o allexportআনসেট করতে) ব্যবহার করতে পারেন।


¹ bashসতর্কতা অবলম্বন করুন যে এটি পরিবেশে রফতানি করার সময় ঘোষিত সমস্ত ফাংশনও ঘটায় allexport(যেমন BASH_FUNC_myfunction%%পরিবেশের ভেরিয়েবলগুলি bashসেই পরিবেশে চলমান সমস্ত শাঁস দ্বারা আমদানি করা হয় , এমনকি চলমান অবস্থায়ও sh)।


1

শুধু কর:

while read LINE; do export "$LINE"; done < ./tmp.txt

কাজ করে কিনা তা আপনি পরীক্ষা করে দেখেছেন?
রালফ্রেডল

@ রালফফ্রিডল এই কাজ করা উচিত, কেন না? এটি খুব মার্জিত এবং সোর্সিং এর সাথে set -aঅনেক সহজ হবে না, তবে এটি আসলে কাজ করে।
টেরডন

এটি ভঙ্গুর। এটি ইনপুট ফাইলে মন্তব্যের অনুমতি দেয় না, উদ্ধৃত ভেরিয়েবল মানগুলি সঠিকভাবে পরিচালনা করে না এবং বহু-লাইন ভেরিয়েবলগুলিতে ব্যর্থ হয়। মঞ্জুর আমার কাছে বহু মাল্টি-লাইন ভেরিয়েবল নেই তবে আমি নিয়মিত মন্তব্য ব্যবহার করি এবং প্রায়শই পরিবর্তনশীল মানগুলির জন্য উদ্ধৃতি ব্যবহার করা দরকার।
লুই

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