এটি মূল্যায়ন কীভাবে কাজ করে তা একটি প্রশ্নে নেমে আসে। উভয় উদাহরণ একইভাবে কাজ করে, শেল (বাশ, এখানে) ভেরিয়েবলগুলি কীভাবে প্রসারিত করে তার কারণে সমস্যাটি ঘটে।
আপনি যখন এই আদেশটি লিখবেন:
HOME="foo" echo $HOME
$HOMEসম্প্রসারিত করা হয় আগে কমান্ড চালানো হয় । অতএব, এটি কমান্ডের জন্য সেট করে রেখেছেন এমনটি নয় তবে এটি মূল মানে প্রসারিত হবে। HOMEপরিবর্তনশীল প্রকৃতপক্ষে পরিবেশের মধ্যে পরিবর্তন করা হয়েছে echoকমান্ড চলমান, কিন্তু, আপনি মুদ্রণ করা হয় $HOMEপিতা বা মাতা থেকে।
উদাহরণস্বরূপ, এটি বিবেচনা করুন:
$ HOME="foo" bash -c 'echo $HOME'
foo
$ echo $HOME
/home/terdon
আপনি উপরে দেখতে পাচ্ছেন, প্রথম কমান্ড অস্থায়ীভাবে পরিবর্তিত মানটির HOMEমুদ্রণ করে এবং দ্বিতীয়টি মূল মুদ্রণ করে, এটি দেখায় যে চলকটি কেবল অস্থায়ীভাবে পরিবর্তিত হয়েছিল। যেহেতু bash -c ...কমান্ডটি ডাবলগুলি ( ' ') এর পরিবর্তে একক উদ্ধৃতি ( ) এ আবদ্ধ রয়েছে " ", ভেরিয়েবলটি প্রসারিত হয় না এবং নতুন বাশ প্রক্রিয়া হিসাবে যেমন হয় তেমনটি পাস হয়। এই নতুন প্রক্রিয়াটি এরপরে এটি প্রসারিত করে এবং এটিতে সেট করা নতুন মানটি মুদ্রণ করে। আপনি যদি এটি ব্যবহার করেন তবে এটি ঘটতে দেখবেন set -x:
$ set -x
$ HOME="hello" echo "$HOME"
+ HOME=hello
+ echo hello
hello
আপনি উপরে দেখতে পারেন যে ভেরিয়েবলটি $HOME কখনও পাস হয় না echo। এটি কেবল এর প্রসারিত মান দেখে। তুলনা করা:
$ HOME="hello" bash -c 'echo $HOME'
+ HOME=hello
+ bash -c 'echo $HOME'
hello
এখানে, একক উদ্ধৃতিগুলির কারণে, ভেরিয়েবল এবং এর মানটি নয় নতুন প্রক্রিয়াতে প্রেরণ করা হয়।
local।