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


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.