আমি অন্যটির থেকে একটি শেলের উদাহরণের পরিবেশগত পরিবর্তনশীলগুলি সেট করতে আগ্রহী। তাই আমি কিছু গবেষণা করার সিদ্ধান্ত নিয়েছি। একটি পড়ার পর সংখ্যা এর প্রশ্ন সম্পর্কে এই আমি এটি পরীক্ষা করার সিদ্ধান্ত নিয়েছে।
আমি দুটি শেল এ এবং বি (পিআইডি 420) তৈরি করেছি, উভয়ই চলছে zsh
। শেল থেকে এআই নিম্নলিখিত চালিত।
sudo gdb -p 420
(gdb) call setenv("FOO", "bar", 1)
(gdb) detach
শেল বি থেকে চালানোর সময় আমি env
দেখতে পাই ভেরিয়েবল এফও সত্যই বারের মান সহ সেট করা আছে। এটি আমাকে ভাবতে বাধ্য করে যে শেল বি এর পরিবেশে এফইউ সাফল্যের সাথে সূচনা করা হয়েছে তবে যাইহোক, আমি যদি এফইও প্রিন্ট করার চেষ্টা করি তবে আমি খালি লাইন পেয়েছি তা নির্ধারণ করা হয়নি। আমার কাছে মনে হচ্ছে এখানে একটা দ্বন্দ্ব আছে।
এটি আমার নিজস্ব আর্চ জিএনইউ / লিনাক্স সিস্টেম এবং একটি উবুন্টু ভিএম উভয়ে পরীক্ষা করা হয়েছিল। আমি এটি পরীক্ষা করেছিলাম bash
যেখানে পরিবর্তনশীল এমনকি এনভির মধ্যেও দেখা যায় নি। এটি যদিও আমার জন্য হতাশাব্যঞ্জক, যদি শেলটি তার পরিবেশের অনুলিপি সময়ে একটি অনুলিপিটি ক্যাশে করে এবং কেবলমাত্র এটি ব্যবহার করে (যা কোনও লিঙ্কযুক্ত প্রশ্নের মধ্যে পরামর্শ দেওয়া হয়েছিল) তা বোঝায়। zsh
চলকটি কেন দেখতে পারে তা এখনও উত্তর দেয় না ।
echo $FOO
খালি আউটপুট কেন ?
সম্পাদনা
মন্তব্যে ইনপুট দেওয়ার পরে আমি আরও কিছু পরীক্ষা করার সিদ্ধান্ত নিয়েছি। ফলাফলগুলি নীচের সারণিতে দেখা যায়। প্রথম কলামে শেলটি যা FOO
ভেরিয়েবলটি ইনজেক্ট করা হয়েছিল। প্রথম সারিতে কমান্ডটি রয়েছে যার আউটপুট এটির নীচে দেখা যায়। পরিবর্তনশীল FOO
ব্যবহার ইনজেকশনের ছিল: sudo gdb -p 420 -batch -ex 'call setenv("FOO", "bar", 1)'
। Zsh সম্পর্কিত নির্দিষ্ট কমান্ডগুলি zsh -c '...'
ব্যাশ ব্যবহার করেও পরীক্ষা করা হয়েছিল। ফলাফলগুলি অভিন্ন ছিল, তাদের আউটপুট বংশবৃদ্ধির জন্য বাদ দেওয়া হয়েছিল।
আর্চ জিএনইউ / লিনাক্স, জেডএস 5.3.1, বাশ 4.4.12 (1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
উবুন্টু 16.04.2 এলটিএস, জেডএস 5.1.1, বাশ 4.3.48 (1)
| | env | grep FOO | echo $FOO | zsh -c 'env | grep FOO' | zsh -c 'echo $FOO' | After export FOO |
|------|------------------|-----------|---------------------------|----------------------|-----------------------------------|
| zsh | FOO=bar | | FOO=bar | bar | No Change |
| bash | | bar | | | Value of FOO visible in all tests |
উপরেরগুলি দ্বারা বোঝা যাচ্ছে যে ফলাফলগুলি বিতরণ অজ্ঞেয়। এটি আমার অনেক বেশি বলুন না zsh
এবং bash
ভিন্নভাবে ভেরিয়েবল হ্যান্ডেলে সেটিং। তদতিরিক্ত, export FOO
শেলের উপর নির্ভর করে এই প্রসঙ্গে খুব আলাদা আচরণ রয়েছে। আশা করি এই পরীক্ষাগুলি অন্য কারও কাছে কিছু পরিষ্কার করে দিতে পারে।
env
) পরিবর্তিত পরিবেশটি দেখে।
zsh
এটি শেল ভেরিয়েবল হিসাবে দৃশ্যমান করে না তবে এটি শিশু প্রক্রিয়াগুলিতে প্রেরণ করে দেয় (যেমন আপনি) পরিলক্ষিত হয়েছে, এক করার সময় bash
নেই এটি একটি শেল পরিবর্তনশীল যেমন দৃশ্যমান করতে কিন্তু আছে না এটা চাইল্ড প্রসেস কাছে হস্তান্তর কারণ হোন! দেখে মনে হচ্ছে zsh এবং ব্যাশগুলি ভেরিয়েবলগুলি পরিচালনা করার জন্য বিভিন্ন কৌশল ব্যবহার করে, zsh ট্র্যাকিং নন-এনভায়রনমেন্ট ভেরিয়েবল এবং বাশ তার পরিবেশের সমস্ত কিছু সংরক্ষণ করে যা এটি কোনও (সাব -হেল) শিশু প্রবর্তনের সময় স্যানিটাইজ করে।
export FOO
হন তবে এটি কোনও পার্থক্য রাখে bash
?
zsh -c 'echo $FOO'
পরিবর্তে আপনি যদি (একক উদ্ধৃতি ব্যবহার করুন!) করেন তবে কী হবে? আপনি কি এটি দেখতে পারেন?