যদি আমি দৌড়ান
export TEST=foo
echo $TEST
এটি foo আউটপুট।
যদি আমি দৌড়ান
TEST=foo echo $TEST
এটা না. এক্সপোর্ট বা স্ক্রিপ্ট ব্যবহার না করে আমি কীভাবে এই কার্যকারিতাটি পেতে পারি?
যদি আমি দৌড়ান
export TEST=foo
echo $TEST
এটি foo আউটপুট।
যদি আমি দৌড়ান
TEST=foo echo $TEST
এটা না. এক্সপোর্ট বা স্ক্রিপ্ট ব্যবহার না করে আমি কীভাবে এই কার্যকারিতাটি পেতে পারি?
উত্তর:
এটি হ'ল শেলটি কমান্ড লাইনে পরিবর্তনশীল প্রসারণ করে এটি কমান্ডটি চালানোর আগে এবং সেই সময়ে ভেরিয়েবলটির অস্তিত্ব থাকে না। আপনি যদি ব্যবহার
TEST=foo; echo $TEST
এটা কাজ করবে।
export
পরবর্তীকালে সম্পাদিত কমান্ডের পরিবেশে ভেরিয়েবলটি প্রদর্শিত হবে (এর জন্য এটি কীভাবে কাজ করে দেখুন help export
)। যদি আপনার কেবলমাত্র একটি কমান্ডের পরিবেশে পরিবর্তনশীল উপস্থিত হয় তবে আপনি যা চেষ্টা করেছেন তা ব্যবহার করুন, যেমন:
TEST=foo your-application
$TEST
কমান্ড লাইন কার্যকর হওয়ার আগে শেলটি প্রসারিত হয়। একবার echo
চলমান (এটি নোট করুন যা echo
সাধারণত শেল বিল্ট-ইন কমান্ডে অনুবাদ করবে এবং নাও /bin/echo
) এটি তার পরিবেশে পরিবর্তনশীল সেটটি দেখবে। যাইহোক, এর পরিবেশ থেকে ভেরিয়েবলের বিষয়বস্তু আউটপুট echo $TEST
করতে বলে না । এটি শেলটিকে বর্তমানে যুক্ত ভেরিয়েবলের মধ্যে যা আছে তা যুক্তি দিয়ে চালিয়ে যেতে বলেছে - এবং সেগুলি দুটি খুব আলাদা জিনিস। echo
TEST
echo
TEST
var=value sh -c 'echo "$var"'
?
"… $var …"
) এর মধ্যে প্রসারিত হয় তবে একক উদ্ধৃতিতে (যেমন, '… $var …'
) নয়। যেহেতু echo "$var"
একক উদ্ধৃতিগুলির ভিতরে রয়েছে, সেই পুরো স্ট্রিংটি sh -c
বাইরের, ইন্টারেক্টিভ শেল দ্বারা ব্যাখ্যা না করেই নতুন ( ) শেলটিতে পৌঁছে যায় । … (চালিয়ে যাওয়া)
sh -c
) শিশু শেল দ্বারা।
আমার সন্দেহ হয় আপনার পরিবেশের ভেরিয়েবলের পরিবর্তে শেল ভেরিয়েবলের সীমিত সুযোগ থাকতে চান । এনভায়রনমেন্ট ভেরিয়েবল হ'ল কমান্ডগুলিতে কার্যকর হওয়া স্ট্রিংগুলির একটি তালিকা ।
মধ্যে
var=value echo whatever
var=value
প্রতিধ্বনি গ্রহণকারী পরিবেশে আপনি স্ট্রিংটি পার করছেন । তবে, echo
তার পরিবেশ তালিকা এবং যে কোনও উপায়ে বেশিরভাগ শেলের মধ্যে কিছু নেই, echo
অন্তর্নির্মিত এবং তাই কার্যকর করা হয় না ।
আপনি যদি লিখতেন
var=value sh -c 'echo "$var"'
এটা অন্য বিষয় হতে পারে। এখানে, আমরা পার করছি var=value
করার sh
কমান্ড, এবং sh
তার পরিবেশের ব্যবহার করতে ঘটবে। শেলগুলি তাদের পরিবেশ থেকে প্রাপ্ত প্রতিটি ভেরিয়েবলকে শেল ভেরিয়েবলে রূপান্তরিত করে, সুতরাং var
পরিবেশে পরিবর্তনশীল sh
প্রাপ্ত একটি $var
ভেরিয়েবলে রূপান্তরিত হবে , এবং যখন এটি echo
কমান্ড লাইনে এটি প্রসারিত করবে, তখন তা হয়ে যাবে echo value
। কারণ পরিবেশ ডিফল্ট উত্তরাধিকারসূত্রে হয়, echo
এছাড়াও পাবেন var=value
তার পরিবেশে (অথবা হলে মৃত্যুদন্ড কার্যকর করা হয়), কিন্তু আবার, echo
পরিবেশ সম্পর্কে গ্রাহ্য না করে।
এখন, যদি আমার সন্দেহ হয়, আপনি যা চান তা হ'ল শেল ভেরিয়েবলের পরিধি সীমিত করার জন্য, বেশ কয়েকটি সম্ভাব্য পন্থা রয়েছে।
বহনযোগ্যভাবে (বোর্ন এবং পসিক্স):
(var=value; echo "1: $var"); echo "2: $var"
উপরের (...) একটি সাব-শেল (বেশিরভাগ শেলের মধ্যে একটি নতুন শেল প্রক্রিয়া) শুরু করে, সুতরাং সেখানে ঘোষিত যে কোনও পরিবর্তনশীল কেবল সেই উপ-শেলকেই প্রভাবিত করবে, সুতরাং আমি উপরের কোডটি "1: মান" আউটপুট করার আশা করছিলাম এবং "2:" বা "2: যা আগে-আগে-সেট-করা ছিল" set
বেশিরভাগ বোর্নের মতো শেলসের সাহায্যে আপনি ফাংশন এবং "স্থানীয়" বিল্টিন ব্যবহার করতে পারেন:
f() {
local var
var=value
echo "1: $var"
}
f
echo "2: $var"
Zsh সহ, আপনি ইনলাইন ফাংশনগুলি ব্যবহার করতে পারেন:
(){ local var=value; echo "1: $var"; }; echo "2: $var"
বা:
function { local var=value; echo "1: $var"; }; echo "2: $var"
বাশ এবং জেডএস (তবে ছাই, পিডিক্স বা এটিএন্ডটি কেএসএস নয়) সহ এই কৌশলটিও কাজ করে:
var=value eval 'echo "1: $var"'; echo "2: $var"
একটি বৈকল্পিক যে আরো কয়েকটি শেল কাজ করে ( dash
, mksh
, yash
) কিন্তু না zsh
(যদি না এর মধ্যে sh
/ ksh
এমুলেশন):
var=value command eval 'echo "1: $var"'; echo "2: $var"
( command
পসিক্স eval
শেলগুলিতে একটি বিশেষ বিল্টিনের সামনে (এখানে ) ব্যবহার করে তাদের বিশেষত্বটি মুছে ফেলা হয় (এখানে যেগুলি থেকে ভেরিয়েবল অ্যাসাইনমেন্টগুলি তারা ফিরে আসার পরে কার্যকর হয়))
আপনি এটি সঠিকভাবে করছেন, তবে ব্যাশ বাক্য বাক্যটি ভুল ব্যাখ্যা করা সহজ: আপনি ভাবতে পারেন যে এনভ ভার্চ আনার echo $TEST
কারণ এটি মুদ্রণ করে, এটি তা নয়। তাই দেওয়া হয়েছেecho
TEST
export TEST=123
তারপর
TEST=456 echo $TEST
নিম্নলিখিত ক্রম জড়িত:
শেলটি পুরো কমান্ড লাইনটিকে পার্স করে এবং সমস্ত পরিবর্তনশীল বিকল্পগুলি কার্যকর করে, সুতরাং কমান্ড লাইনটি হয়ে যায়
TEST=456 echo 123
এটি কমান্ডের আগে টেম্প ভারসেট তৈরি করে, সুতরাং এটির বর্তমান মান সংরক্ষণ করে TEST
এবং এটি 456 দিয়ে ওভাররাইট করে; কমান্ড লাইন এখন
echo 123
এটি অবশিষ্ট কমান্ড কার্যকর করে, যা এই ক্ষেত্রে স্টাডাউট থেকে 123 প্রিন্ট করে (সুতরাং শেল কমান্ডটি যে টেম্পল মানটি ব্যবহার করে না TEST
)
এটির মান পুনরুদ্ধার করে TEST
পরিবর্তে প্রিন্টেনভ ব্যবহার করুন, কারণ এতে পরিবর্তনশীল প্রতিস্থাপন জড়িত না:
>> export TEST=123
>> printenv TEST
123
>> TEST=456 printenv TEST
456
>> printenv TEST && TEST=456 printenv TEST && TEST=789 printenv TEST && printenv TEST
123
456
789
123
>>
printenv
ধারণার প্রমাণ / পরীক্ষার পক্ষে সহায়ক (স্ক্রিপ্টের মতো আচরণ করে, এর বিপরীতে echo
)
আপনি এটি ব্যবহার করে এই কাজটি পেতে পারেন:
TEST=foo && echo $TEST
TEST=foo
একটি পৃথক বিবৃতি হিসাবে চলমান - এটি কেবলমাত্র প্রসঙ্গে সেট করা হয়নি echo
।