/ বিন / sh উত্স স্টিডিনের (অন্যান্য প্রোগ্রাম থেকে) ফাইল নয়


14

নামটির জন্য একটি কৌতুকপূর্ণ ধরণের ...

মূলত আমার একটি প্রোগ্রাম রয়েছে যা যখন শেল ভেরিয়েবলের সেট স্টুডে প্রিন্ট চালায়:

$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".

আমি এটি শেল স্ক্রিপ্টের মধ্যে থেকে এমনভাবে চালাতে চাই যেন STDOUT দ্বারা মূল্যায়ন করা হচ্ছে source

আমি কিছু করতে চাই ...

source `./settings`

... তবে অবশ্যই এটি কাজ করে না।

আমি জানি আমি করতে পারি:

./settings >/tmp/file
source /tmp/file

তবে আমি সত্যিই এটি করতে চাই না।

কোন সংকেত সনাক্ত করুন?

উত্তর:


16

আপনি ব্যবহার করতে পারেন eval:

eval "$(./settings)"

eval "`./settings`"

দুঃখিত, উল্লেখ করা উচিত ছিল, এটি / বিন / শ বাশ নয়। $ () কাজ করে না। আমি প্রশ্ন আপডেট করেছি।
মাজনকো

@ ম্যাট: ঠিক আছে, sh বেশিরভাগ সিস্টেমে বাশ। অবশ্যই আপনি সাম্প্রতিক উবুন্টু সংস্করণ বোঝাতে চেয়েছিলেন, যেখানে এটি ড্যাশ দিয়ে প্রতিস্থাপন করা হয়েছে।
হ্যালো 71

@ ম্যাট: সেক্ষেত্রে ব্যাকটিক্সের কাজ করা উচিত। তবে shআপনারও এর সঠিক সংস্করণটি যুক্ত করা উচিত - এটি ড্যাশ, ছাই, ব্যস্তবক্সের জন্য একটি সিমিলিংক হতে পারে ... আমি "আসল 'শে'" লাইভের অনুলিপিটি দেখিনি।
ব্যবহারকারী1686

1
@ ম্যাট: সুতরাং আপনি একটি ... আকর্ষণীয় সিস্টেম পেয়েছেন। বিশেষত যেহেতু প্রায় সমস্ত "sh" বৈচিত্রগুলি সমর্থন করে $( )- ৪.৩ বিবিএসডি - তে অ্যালামকুইস্টের শেল দিয়ে শুরু হয় - এবং এটি পসিক্সও(দ্রষ্টব্য: তর্ক করছেন না, কেবল কৌতূহল))
ব্যবহারকারীর 6868

$ () বিদ্যমান, এটি এই পরিস্থিতিতে এর মতো কাজ করে না। ফ্রিবিএসডি 8.2 এর / বিন / শ
মাজনকো

15

যেসব সিস্টেমে /dev/fdউপলভ্য আছে, সেখানে ব্যাশ প্রক্রিয়া প্রতিস্থাপন সমর্থন করে:

source <(./settings)

এখানে, <( )একটি স্বয়ংক্রিয়ভাবে নির্ধারিত পথে প্রসারিত হবে /dev/fd/...যার অধীনে আউটপুটটি ./settingsপড়া যায়।


1
ব্যাশ ম্যানুয়ালটিতে এটিকে "প্রক্রিয়া বিকল্প" বলা হয়।
গ্লেন জ্যাকম্যান 20

6
declare `./settings`

বা অবশ্যই ...

export `./settings`

অবশ্যই এটি পরীক্ষা করুন ...

export `echo -e "asdf=test\nqwerty=dvorak"` ; echo $asdf $qwerty

হোয়াইটস্পেস হ্যান্ডলিং:

eval export `./settings`

আহা, exportকৌতুক কাজ করে! ধন্যবাদ
মাজনকো

এখন - আমি কীভাবে একটি মান ফাঁকা স্থান পরিচালনা করতে পারি?
মাজনকো

@ ম্যাট: আমি মন্তব্যগুলিতে ব্যাকটিক্স ব্যবহার করতে পারি না, তাই সম্পাদিত উত্তর দেখুন।
user1686

@ গ্রায়েটি: হ্যাঁ আপনি পারবেন ...a backtick --> ` <-- and here's another one --> ` <--
হ্যালো 71

2

source /dev/stdin < ./settings

আমি মনে করি / dev / stdin একটি লিনাক্স যদিও কেবল thing


সেটিংসের সামগ্রীটি উত্স করতে চেষ্টা করে। এমনকি './settings' দিয়েও এটি './setting' এর সাথে ব্যর্থ হয়: দ্বিধাগ্রস্থ ('= ব্যাকটিক)
মাজেঙ্কো

/dev/stdinবিএসডি এবং সাইগউইনেও কাজ করে।
ব্যবহারকারী1686

1
|তবে ব্যবহার করা কাজ করছে না (কমপক্ষে ঠিক তেমন নয়), কারণ পাইপের উভয় দিকই পৃথক সাবপ্রসেসিস, সুতরাং স্রোসযুক্ত কমান্ডগুলি বর্তমান শেলকে প্রভাবিত করবে না।
ব্যবহারকারী1686

1
যে প্রতিফলিত সম্পাদিত।
লরেন্স

1
আমি এই /dev/stdinকৌশলটি পছন্দ করি তবে আপনার উত্তরটি যা করে তা বাস্তবে source ./settingsএটি কার্যকর না করে সমতল সমতুল্য । এক এই পরাস্ত করার জন্য একটি এখানে নথি ব্যবহার করতে পারে: source /dev/stdin <<EOF \n $(./settings) \n EOF
tlWitec

0

এখানে অন্য দৃষ্টিকোণ সরবরাহ করতে চেয়েছিল, অন্য উত্তরগুলি ফাইল তৈরি করে এবং সরাসরি স্টিডিন থেকে টানছে না। আমার কয়েকটি বিল্ড রয়েছে যার একাধিক স্ক্রিপ্টগুলিতে কিছু প্রস্তুত পরিবেশের তথ্য প্রেরণ করা দরকার। আমি যা করছি তা হল স্ট্রিংয়ের একগুচ্ছ বাশ সামঞ্জস্যপূর্ণ ভেরিয়েবল অ্যাসাইনমেন্ট প্রস্তুত করা:

Var1="Foo"
Var2="Bar"
Var3="Baz"

আমি যখন স্ক্রিপ্টটি সম্পাদন করার প্রস্তুতি নিচ্ছি, আমি উপরের মাল্টলাইন স্ট্রিংটি এনকোড করেছি এবং এটি আমার শেল স্ক্রিপ্টে পাইপ করব:

echo base64EncodedParameters | build.sh

Build.sh এ আমি স্টিডিন থেকে পড়েছি, বেস 64 ডিকোড করে ফলাফলটি প্রকাশ করি।

params=""
while read line; do params="${params}${line}"; done
eval `echo $params | base64 -D`

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