তারা প্রক্রিয়া দ্বারা scoped হয়
অন্যান্য উত্তরদাতারা আমাকে বুঝতে সাহায্য করেছিল যে শেল ভেরিয়েবলের সুযোগগুলি প্রক্রিয়া এবং তাদের বংশধর সম্পর্কে ।
আপনি যখন ls
কমান্ড লাইনের মতো একটি কমান্ড টাইপ করেন , আপনি আসলে ls
প্রোগ্রামটি চালানোর জন্য একটি প্রক্রিয়াটি তৈরি করছেন । নতুন প্রক্রিয়াটিতে এটির পিতামাতা হিসাবে আপনার শেল রয়েছে।
যে কোনও প্রক্রিয়ার নিজস্ব "স্থানীয়" ভেরিয়েবল থাকতে পারে, যা শিশু প্রক্রিয়াগুলিতে পাস হয় না। এটি "এনভায়রনমেন্ট" ভেরিয়েবলও সেট করতে পারে, যা। ব্যবহার export
পরিবেশের পরিবর্তনশীল তৈরি করে । উভয় ক্ষেত্রেই, সম্পর্কিত না হওয়া প্রক্রিয়াগুলি (আসল অংশের সমকক্ষরা) চলকটি দেখতে পাবে না; আমরা কেবল শিশু প্রক্রিয়াগুলি যা দেখি তা নিয়ন্ত্রণ করি।
ধরুন আপনি একটি ব্যাশ শেল, যা আমরা উ: আপনি টাইপ ডাকবো আছে bash
, যা একটি শিশু প্রক্রিয়া ব্যাশ শেল, যা আমরা বি যেকোনো কিছু ডাকবো তোমাকে ডেকেছিলাম সৃষ্টি export
এখনো বি সেট হবে উপর
এখন, খ, আপনি বলেন FOO=b
। দুই জিনিস এক ঘটবে:
- যদি বি (এ থেকে) নামক পরিবেশের পরিবর্তনশীল না পেয়ে থাকে তবে
FOO
এটি একটি স্থানীয় ভেরিয়েবল তৈরি করে। বি এর বাচ্চারা এটি পাবে না (খ কল না দিলে export
)।
- তাহলে বি হয়নি (একটি থেকে) গ্রহণ একটি পরিবেশ পরিবর্তনশীল callled
FOO
, এটা হবে এটি নিজে এবং তার পরবর্তীকালে forked শিশুদের জন্য সংশোধন । বি এর সন্তানরা যে মূল্য নির্ধারণ করবে তা দেখবে। তবে এটি এটিকে মোটেও প্রভাব ফেলবে না।
এখানে একটি দ্রুত ডেমো রয়েছে।
FOO=a # set "local" environment variable
echo $FOO # 'a'
bash # forks a child process for the new shell
echo $FOO # not set
exit # return to original shell
echo $FOO # still 'a'
export FOO # make FOO an environment variable
bash # fork a new "child" shell
echo $FOO # outputs 'a'
FOO=b # modifies environment (not local) variable
bash # fork "grandchild" shell
echo $FOO # outputs 'b'
exit # back to child shell
exit # back to original shell
echo $FOO # outputs 'a'
এগুলি সমস্তই আমার আসল সমস্যাটি ব্যাখ্যা করে: আমি GEM_HOME
আমার শেলটি সেট করেছিলাম, কিন্তু যখন আমি ফোন করেছি bundle install
, এটি একটি শিশু প্রক্রিয়া তৈরি করেছে। যেহেতু আমি ব্যবহার করি নি export
, শিশু প্রক্রিয়াটি শেলটি পায় নি GEM_HOME
।
আন রপ্তানি
আপনি একটি পরিবর্তনশীল "আন-এক্সপোর্ট" করতে পারেন - এটি ব্যবহার করে বাচ্চাদের কাছে পৌঁছে দেওয়া থেকে রোধ করতে পারেন export -n FOO
।
export FOO=a # Set environment variable
bash # fork a shell
echo $FOO # outputs 'a'
export -n FOO # remove environment var for children
bash # fork a shell
echo $FOO # Not set
exit # back up a level
echo $FOO # outputs 'a' - still a local variable
FOO=bar
, এটি বর্তমান শেল প্রক্রিয়াটির জন্য মান নির্ধারণ করে। আমি যদি তখন (bundle install
) এর মতো কোনও প্রোগ্রাম পরিচালনা করি তবে এটি একটি শিশু প্রক্রিয়া তৈরি করে, যা অ্যাক্সেস পায় নাFOO
। তবে আমি যদি বলতামexport FOO=bar
, শিশু প্রক্রিয়াটি (এবং এর বংশধরেরা) এতে অ্যাক্সেস করতে পারে। এর মধ্যে একটিexport FOO=buzz
তার পরিবর্তে তার বংশধরদের জন্য মান পরিবর্তন করতে বা কেবলFOO=buzz
নিজের জন্য মান পরিবর্তন করার জন্য কল করতে পারে। এটা কি ঠিক?