এর মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য
bash -c "$1"
এবং
eval "$1"
এটি কি পূর্বে একটি সাবশেলে চালায় এবং পরেরটি তা করে না। তাই:
set -- 'var=something'
bash -c "$1"
echo "$var"
আউটপুট:
#there doesn't seem to be anything here
set -- 'var=something'
eval "$1"
echo "$var"
আউটপুট:
something
যদিও কেউ কেন কখনও কার্যনির্বাহী bash
সেভাবে ব্যবহার করতে পারে তা আমার কোনও ধারণা নেই । আপনার যদি এটির আবেদন করতেই হয় তবে অন্তর্নির্মিত গ্যারান্টিযুক্ত পোসিক্স ব্যবহার করুন sh
। বা (subshell eval)
আপনি যদি আপনার পরিবেশ রক্ষা করতে চান।
ব্যক্তিগতভাবে, আমি শেলকে .dot
সর্বোপরি পছন্দ করি ।
printf 'var=something%d ; echo "$var"\n' `seq 1 5` | . /dev/fd/0
আউটপুট
something1
something2
something3
something4
something5
তবে আপনি কি সব কিছু প্রয়োজন?
হয় ব্যবহার করার একমাত্র কারণ, সত্যই, আপনার ভেরিয়েবল আসলে অন্যটিকে নির্ধারিত করে বা মূল্যায়ন করে বা শব্দ বিভাজন আউটপুটটির পক্ষে গুরুত্বপূর্ণ।
এই ক্ষেত্রে:
var='echo this is var' ; $var
আউটপুট:
this is var
এটি কাজ করে তবে কেবল echo
তার যুক্তি গণনা সম্পর্কে চিন্তা করে না।
var='echo "this is var"' ; $var
আউটপুট:
"this is var"
দেখা? ডাবল-কোটগুলি সাথে আসে কারণ শেলের সম্প্রসারণের $var
ফলাফলটির জন্য মূল্যায়ন হয় না quote-removal
।
var='printf %s\\n "this is var"' ; $var
আউটপুট:
"this
is
var"
তবে eval
বা সাথে sh
:
var='echo "this is var"' ; eval "$var" ; sh -c "$var"
আউটপুট:
this is var
this is var
যখন আমরা ব্যবহার করি eval
বা sh
শেলটি বিস্তারের ফলাফলগুলিতে দ্বিতীয় পাস নেয় এবং এগুলি একটি সম্ভাব্য কমান্ড হিসাবেও মূল্যায়ণ করে, এবং সুতরাং উদ্ধৃতিগুলি পৃথক হয়। আপনি এটি করতে পারেন:
. <<VAR /dev/fd/0
${var:=echo "this is var"}
#END
VAR
আউটপুট
this is var
e='echo foo'; $e
ঠিক কাজ করে।