আসুন আমরা একটি নির্দিষ্ট উদাহরণ বিবেচনা করি। grep
কমান্ড একটি পরিবেশ পরিবর্তনশীল নামক ব্যবহার GREP_OPTIONS
ডিফল্ট বিকল্পসমূহ সেট করতে।
এখন। এই ফাইলটিতে test.txt
নিম্নলিখিত লাইন রয়েছে:
line one
line two
কমান্ড চালানো grep one test.txt
ফিরে আসবে
line one
আপনি যদি -v
বিকল্পটির সাথে গ্রেপ চালনা করেন তবে এটি মিলবে না এমন লাইনগুলি ফিরিয়ে দেবে, ফলে আউটপুট হবে
line two
আমরা এখন পরিবেশগত পরিবর্তনশীল সহ বিকল্পটি সেট করার চেষ্টা করব।
export
আপনি যে কমান্ডগুলি কল করছেন তার পরিবেশ ছাড়াই সেট করা পরিবেশ পরিবর্তনশীলগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হবে না।
GREP_OPTIONS='-v'
grep one test.txt
ফলাফল:
line one
স্পষ্টতই, বিকল্পটি -v
পাস হয়নি grep
।
আপনি কেবল শেলটি ব্যবহারের জন্য কোনও ভেরিয়েবল সেট করার সময় আপনি এই ফর্মটি ব্যবহার করতে চান, উদাহরণস্বরূপ for i in * ; do
আপনি রফতানি করতে চান না $i
।
যাইহোক, ভেরিয়েবলটি সেই নির্দিষ্ট কমান্ড লাইনের পরিবেশে প্রেরণ করা হয়, সুতরাং আপনি এটি করতে পারেন
GREP_OPTIONS='-v' grep one test.txt
যা প্রত্যাশিত ফিরে আসবে
line two
আপনি এই ফর্মটি ব্যবহার করেন অস্থায়ীভাবে এই প্রোগ্রামটির আরম্ভ হওয়া বিশেষ ইভেন্টটির পরিবেশটি অস্থায়ীভাবে পরিবর্তনের জন্য।
কোনও ভেরিয়েবল রফতানি করার কারণে ভেরিয়েবলটি উত্তরাধিকার সূত্রে প্রাপ্ত হয়:
export GREP_OPTIONS='-v'
grep one test.txt
এখন ফিরে
line two
শেলটিতে পরবর্তীকালে শুরু হওয়া প্রক্রিয়াগুলির জন্য ভেরিয়েবল সেট করার এটি সর্বাধিক সাধারণ উপায়
এই সব বাশ মধ্যে করা হয়েছিল। export
একটি বাশ অন্তর্নির্মিত; VAR=whatever
বাশ সিনট্যাক্স। env
অন্যদিকে, এটি একটি প্রোগ্রাম। যখন env
ডাকা হয়, নিম্নলিখিত জিনিসগুলি ঘটে:
- কমান্ডটি
env
একটি নতুন প্রক্রিয়া হিসাবে কার্যকর করা হবে
env
পরিবেশ পরিবর্তন করে, এবং
- আর্গুমেন্ট হিসাবে সরবরাহ করা কমান্ডকে কল করে।
env
প্রক্রিয়া দ্বারা প্রতিস্থাপিত হয় command
প্রক্রিয়া।
উদাহরণ:
env GREP_OPTIONS='-v' grep one test.txt
এই কমান্ডটি দুটি নতুন প্রক্রিয়া চালু করবে: (i) env এবং (ii) গ্রেপ (আসলে দ্বিতীয় প্রক্রিয়াটি প্রথমটি প্রতিস্থাপন করবে)। এর দৃষ্টিকোণ থেকে grep
প্রক্রিয়া, ফলাফল ঠিক চলমান হিসাবে একই
GREP_OPTIONS='-v' grep one test.txt
তবে আপনি বাশার বাইরে থাকলে বা অন্য শেলটি চালু করতে না চাইলে আপনি এই প্রতিমাটি ব্যবহার করতে পারেন (উদাহরণস্বরূপ, আপনি যখন কলের exec()
পরিবর্তে ফাংশনগুলির পরিবার ব্যবহার করছেন system()
)।
অতিরিক্ত নোট অন #!/usr/bin/env
এজন্য আইডিয়ামটি #!/usr/bin/env interpreter
বরং ব্যবহার করা হয় #!/usr/bin/interpreter
। env
কোনও প্রোগ্রামের পুরো পাথের প্রয়োজন হয় না, কারণ এটি execvp()
ফাংশনটি ব্যবহার করে যা PATH
শেলটির মতো চলকটি অনুসন্ধান করে এবং তারপরে কমান্ড রান দ্বারা নিজেকে প্রতিস্থাপন করে। সুতরাং, কোনও দোভাষী (পারল বা পাইথনের মতো) "পথে" কোথায় বসেছেন তা সন্ধান করতে এটি ব্যবহার করা যেতে পারে।
এর অর্থ হ'ল বর্তমান পথটি সংশোধন করে আপনি প্রভাব ফেলতে পারেন কোন পাইথন রূপটি ডাকা হবে। এটি নিম্নলিখিতগুলি সম্ভব করে তোলে:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
পরিবর্তে ক্যালিবার আরম্ভের ফলাফল হবে
I am an evil interpreter!
export key=value
প্রসারিত বাক্য গঠন এবং বহনযোগ্য স্ক্রিপ্টগুলিতে (যেমন#! /bin/sh
) ব্যবহার করা উচিত নয় ।