উত্তর:
স্ক্রিপ্ট উত্সাহিত করা বর্তমান শেল প্রক্রিয়াতে কমান্ডগুলি চালিত করবে ।
একটি স্ক্রিপ্ট কার্যকর করা একটি নতুন শেল প্রক্রিয়াতে কমান্ডগুলি চালিত করবে ।
যদি আপনি বর্তমানে চলমান শেলটিতে স্ক্রিপ্টটি পরিবেশ পরিবর্তন করতে চান তবে উত্সটি ব্যবহার করুন। অন্যথায় কার্যকর করুন।
আপনি যদি এখনও বিভ্রান্ত হন তবে দয়া করে পড়ুন।
সম্পাদন করতে সিনট্যাক্স এবং উত্স থেকে সিনট্যাক্স সম্পর্কে কিছু সাধারণ বিভ্রান্তি স্পষ্ট করতে:
./myscript
এটি কার্যকর myscript
করা হবে যে ফাইলটি এক্সিকিউটেবল এবং বর্তমান ডিরেক্টরিতে অবস্থিত। শীর্ষস্থানীয় ডট এবং স্ল্যাশ ( ./
) বর্তমান ডিরেক্টরিকে বোঝায়। এটি প্রয়োজনীয় কারণ বর্তমান ডিরেক্টরিটি সাধারণত না থাকে (এবং সাধারণত এটি হওয়া উচিত নয়) $PATH
।
myscript
ফাইলটি নির্বাহযোগ্য এবং কিছু ডিরেক্টরিতে অবস্থিত হলে এটি কার্যকর করা হবে ।myscript
$PATH
source myscript
এটি উত্স হবে myscript
। ফাইলটি কার্যকর করার দরকার নেই তবে এটি অবশ্যই একটি বৈধ শেল স্ক্রিপ্ট হতে হবে। ফাইলটি বর্তমান ডিরেক্টরিতে বা ডিরেক্টরিতে থাকতে পারে $PATH
।
. myscript
এটি উত্স হবে myscript
। এই "বানান" POSIX দ্বারা সংজ্ঞায়িত হিসাবে সরকারী এক । বাশ source
বিন্দুতে একটি উপনাম হিসাবে সংজ্ঞায়িত হয়েছে ।
myscript.sh
নিম্নলিখিত বিষয়বস্তু সহ বিবেচনা করুন :
#!/bin/sh
# demonstrate setting a variable
echo "foo: "$(env | grep FOO)
export FOO=foo
echo "foo: "$(env | grep FOO)
# demonstrate changing of working directory
echo "PWD: "$PWD
cd somedir
echo "PWD: "$PWD
স্ক্রিপ্টটি কার্যকর করার আগে আমরা বর্তমান পরিবেশটি যাচাই করি:
$ env | grep FOO
$ echo $PWD
/home/lesmana
ভেরিয়েবল FOO
সংজ্ঞায়িত করা হয় না এবং আমরা হোম ডিরেক্টরিতে আছি।
এখন আমরা ফাইলটি কার্যকর করি:
$ ./myscript.sh
foo:
foo: FOO=foo
PWD: /home/lesmana
PWD: /home/lesmana/somedir
পরিবেশটি আবার যাচাই করুন:
$ env | grep FOO
$ echo $PWD
/home/lesmana
ভেরিয়েবল FOO
সেট করা নেই এবং কার্যকারী ডিরেক্টরিটি পরিবর্তন হয়নি।
স্ক্রিপ্ট আউটপুট স্পষ্টভাবে দেখায় যে ভেরিয়েবল সেট করা হয়েছিল এবং ডিরেক্টরিটি পরিবর্তন করা হয়েছিল। পরে চেকটি দেখায় যে ভেরিয়েবল সেট করা নেই এবং ডিরেক্টরিটি পরিবর্তন করা হয়নি। কি হলো? পরিবর্তনগুলি একটি নতুন শেলের মধ্যে করা হয়েছিল । বর্তমান শেল একটি উত্পন্ন হওয়া নতুন স্ক্রিপ্ট চালাতে শেল। স্ক্রিপ্টটি নতুন শেলটিতে চলছে এবং পরিবেশের সমস্ত পরিবর্তনগুলি নতুন শেলটিতে কার্যকর হবে। স্ক্রিপ্টটি শেষ হওয়ার পরে নতুন শেলটি নষ্ট হয়ে যায়। নতুন শেলের পরিবেশে সমস্ত পরিবর্তন নতুন শেল দিয়ে ধ্বংস হয়ে যায়। বর্তমান শেলটিতে কেবল আউটপুট পাঠ্য মুদ্রণ করা হয়।
এখন আমরা ফাইলটি উত্স :
$ source myscript.sh
foo:
foo: FOO=foo
PWD: /home/lesmana
PWD: /home/lesmana/somedir
পরিবেশটি আবার যাচাই করুন:
$ env | grep FOO
FOO=foo
$ echo $PWD
/home/lesmana/somedir
ভেরিয়েবল এফইও সেট করা হয়েছে এবং ওয়ার্কিং ডিরেক্টরি পরিবর্তন হয়েছে।
স্ক্রিপ্ট উত্সাহিত করা একটি নতুন শেল তৈরি করে না। সমস্ত কমান্ড বর্তমান শেলটিতে চালিত হয় এবং পরিবেশে পরিবর্তনগুলি বর্তমান শেলটিতে কার্যকর হয়।
নোট করুন যে এই সাধারণ উদাহরণে এক্সিকিউটিভের আউটপুট স্ক্রিপ্টের সোর্সিংয়ের সমান। এটি অগত্যা সর্বদা ক্ষেত্রে হয় না।
নিম্নলিখিত স্ক্রিপ্ট বিবেচনা করুন pid.sh
:
#!/bin/sh
echo $$
( $$
বর্তমান চলমান শেল প্রক্রিয়াটির পিআইডি-তে বিশেষ ভেরিয়েবল প্রসারিত হয়)
প্রথমে বর্তমান শেলের পিআইডি প্রিন্ট করুন:
$ echo $$
25009
লিপিটির উত্স:
$ source pid.sh
25009
স্ক্রিপ্টটি কার্যকর করুন, পিআইডি নোট করুন:
$ ./pid.sh
25011
সূত্র আবার:
$ source pid.sh
25009
আবার কার্যকর করুন:
$ ./pid.sh
25013
আপনি দেখতে পাচ্ছেন যে স্ক্রিপ্টটি সোর্সিং একই প্রক্রিয়ায় চালিত হয় যখন স্ক্রিপ্টটি কার্যকর করে প্রতিটি সময় একটি নতুন প্রক্রিয়া তৈরি করে। এই নতুন প্রক্রিয়াটি হ'ল নতুন শেল যা স্ক্রিপ্টটি কার্যকর করার জন্য তৈরি হয়েছিল। স্ক্রিপ্ট উত্সাহিত করা একটি নতুন শেল তৈরি করে না এবং এইভাবে পিআইডি একই থাকে।
স্ক্রিপ্টটি সোর্সিং এবং এক্সিকিউট করা উভয়ই স্ক্রিপ্ট লাইনে কমান্ডগুলি লাইন দিয়ে চালিয়ে দেবে, যেন আপনি সেই কমান্ডগুলি রেখার সাহায্যে টাইপ করে টাইপ করেন।
পার্থক্যগুলি হ'ল:
যদি আপনি বর্তমানে চলমান শেলটিতে স্ক্রিপ্টটি পরিবেশ পরিবর্তন করতে চান তবে উত্সটি ব্যবহার করুন। অন্যথায় কার্যকর করুন।
আরো দেখুন:
source myscript.sh
এবং এর মধ্যে পার্থক্য আছে . myscript.sh
?
স্ক্রিপ্ট কার্যকর করা একটি পৃথক শিশু প্রক্রিয়াতে চালিত করে, অর্থাত্, স্ক্রিপ্টটি প্রক্রিয়া করার জন্য শেলের একটি পৃথক দৃষ্টিকোণ চাওয়া হয়। এর অর্থ হ'ল স্ক্রিপ্টে বর্ণিত কোনও পরিবেশের ভেরিয়েবল ইত্যাদি প্যারেন্ট (বর্তমান) শেলটিতে আপডেট করা যাবে না ।
স্ক্রিপ্ট উত্সাহিত করার অর্থ এটি বর্তমান শেল নিজেই এটিকে বিশ্লেষণ ও সম্পাদন করে। এটি যেন আপনি স্ক্রিপ্টের বিষয়বস্তু টাইপ করেছেন। এই কারণে, স্ক্রিপ্টটি উত্সাহিত হচ্ছে কার্যকর করার দরকার নেই। তবে এটি কার্যকর করতে হবে যদি আপনি অবশ্যই এটি সম্পাদন করছেন।
যদি বর্তমান শেলটিতে আপনার অবস্থানগত তর্ক থাকে তবে সেগুলি অপরিবর্তিত রয়েছে।
সুতরাং আমি যদি একটি ফাইল থাকে a.sh
:
echo a $*
এবং আমি করি:
$ set `date`
$ source ./a.sh
আমি এরকম কিছু পাই:
a Fri Dec 11 07:34:17 PST 2009
যেখানে:
$ set `date`
$ ./a.sh
আমাকে দেয়:
a
আশা করি এইটি কাজ করবে.
সোর্সিং মূলত কমান্ড প্রম্পটে স্ক্রিপ্টের প্রতিটি লাইন টাইপ করার মতোই ...
এক্সিকিউশন একটি নতুন প্রক্রিয়া শুরু করে এবং তারপরে স্ক্রিপ্টের প্রতিটি লাইন চালায়, কেবল বর্তমান পরিবেশটি যা ফিরে আসে তা পরিবর্তন করে।
উপরের পাশাপাশি, স্ক্রিপ্টটি সম্পাদনা ./myscript
করার জন্য ফাইল ম্যাসক্রিপ্টের জন্য এক্সিকিউট করার অনুমতি প্রয়োজন হয় তবে সোর্সিংয়ের জন্য কোনও মৃত্যুদন্ডের অনুমতি প্রয়োজন হয় না। এজন্য chmod +x myscript
আগে প্রয়োজন হয় নাsource myscript
bash myscript
।
সোর্সিং আপনি স্ক্রিপ্টে সংজ্ঞায়িত সমস্ত অতিরিক্ত ভেরিয়েবল পান।
সুতরাং আপনার যদি কনফিগার বা ফাংশন সংজ্ঞা থাকে তবে আপনার উত্স হওয়া উচিত এবং কার্যকর করা উচিত নয়। মৃত্যুদণ্ড পিতামাতার পরিবেশ থেকে স্বাধীন।
যদি আমি সঠিক মনে করি, স্ক্রিপ্টটি কার্যকর #!
করা একটি আর্গুমেন্ট হিসাবে স্ক্রিপ্ট ফাইলের সাথে লাইনে এক্সিকিউটেবলকে চালিত করে (সাধারণত একটি নতুন শেল শুরু করে এবং কার্যকরভাবে নতুন শেলটিতে স্ক্রিপ্টটি স্যোসারিং করে #!/bin/sh
);
স্ক্রিপ্টটি সোর্সিং করা আপনার বর্তমান শেল পরিবেশের প্রতিটি লাইন কার্যকর করে, যা আপনার বর্তমান শেলটি পরিবর্তনের জন্য দরকারী (উদাহরণস্বরূপ, শেল ফাংশন এবং এক্সপোর্ট পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়নের জন্য একটি উপায় সরবরাহ করে)।
source
কমান্ড প্রদান করা স্ক্রিপ্ট executes (এক্সিকিউটেবল অনুমতি নেই বাধ্যতামূলক নয় ) মধ্যে বর্তমান , শেল পরিবেশ যখন ./
উপলব্ধ executes এক্সিকিউটেবল একটি স্ক্রিপ্ট নতুন শেল।
এছাড়াও, এই উত্তরটির উদাহরণ হিসাবে দেখুন: https://superuser.com/a/894748/432100