বাশ স্ক্রিপ্ট বনাম সোর্সিং কার্যকর করার মধ্যে পার্থক্য কী?


282

এ-এর মতো কোনও বাশ স্ক্রিপ্ট চালানো এবং খ-এর মতো একটি বাশ স্ক্রিপ্ট সসোর্সিংয়ের মধ্যে পার্থক্য কী?

A
> ./myscript

B
> source myscript

: আপনি এই পড়তে পারে bash.cyberciti.biz/guide/Source_command
ERU

উত্তর:


344

সংক্ষিপ্ত উত্তর

স্ক্রিপ্ট উত্সাহিত করা বর্তমান শেল প্রক্রিয়াতে কমান্ডগুলি চালিত করবে ।

একটি স্ক্রিপ্ট কার্যকর করা একটি নতুন শেল প্রক্রিয়াতে কমান্ডগুলি চালিত করবে ।

যদি আপনি বর্তমানে চলমান শেলটিতে স্ক্রিপ্টটি পরিবেশ পরিবর্তন করতে চান তবে উত্সটি ব্যবহার করুন। অন্যথায় কার্যকর করুন।

আপনি যদি এখনও বিভ্রান্ত হন তবে দয়া করে পড়ুন।

পরিভাষা

সম্পাদন করতে সিনট্যাক্স এবং উত্স থেকে সিনট্যাক্স সম্পর্কে কিছু সাধারণ বিভ্রান্তি স্পষ্ট করতে:

./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

আপনি দেখতে পাচ্ছেন যে স্ক্রিপ্টটি সোর্সিং একই প্রক্রিয়ায় চালিত হয় যখন স্ক্রিপ্টটি কার্যকর করে প্রতিটি সময় একটি নতুন প্রক্রিয়া তৈরি করে। এই নতুন প্রক্রিয়াটি হ'ল নতুন শেল যা স্ক্রিপ্টটি কার্যকর করার জন্য তৈরি হয়েছিল। স্ক্রিপ্ট উত্সাহিত করা একটি নতুন শেল তৈরি করে না এবং এইভাবে পিআইডি একই থাকে।

সারাংশ

স্ক্রিপ্টটি সোর্সিং এবং এক্সিকিউট করা উভয়ই স্ক্রিপ্ট লাইনে কমান্ডগুলি লাইন দিয়ে চালিয়ে দেবে, যেন আপনি সেই কমান্ডগুলি রেখার সাহায্যে টাইপ করে টাইপ করেন।

পার্থক্যগুলি হ'ল:

  • আপনি যখন চালানো স্ক্রিপ্ট আপনি একটি খোলার চেষ্টা করছেন নতুন শেল, নতুন শেল কমান্ড টাইপ আউটপুট আপনার বর্তমান শেল ফিরে অনুলিপি করুন, তারপরে নতুন শেল বন্ধ করুন। পরিবেশে যে কোনও পরিবর্তনগুলি কেবল নতুন শেলের মধ্যে কার্যকর হবে এবং নতুন শেলটি বন্ধ হয়ে গেলে তা হারিয়ে যাবে।
  • আপনি যখন স্ক্রিপ্টটি উত্স করবেন তখন আপনি আপনার বর্তমান শেলটিতে আদেশগুলি টাইপ করছেন । পরিবেশের যে কোনও পরিবর্তন কার্যকর হবে এবং আপনার বর্তমান শেলটিতে থাকবে।

যদি আপনি বর্তমানে চলমান শেলটিতে স্ক্রিপ্টটি পরিবেশ পরিবর্তন করতে চান তবে উত্সটি ব্যবহার করুন। অন্যথায় কার্যকর করুন।


আরো দেখুন:


2
সোর্সিংয়ের একটি ব্যবহার আপনার স্ক্রিপ্টগুলির জন্য কনফিগারেশন ফাইলের একটি প্রাথমিক রূপ তৈরি করছে। আপনি ডিফল্ট মানগুলিতে বিভিন্ন ভেরিয়েবল সেট করে শুরু করেন এবং তারপরে myscript.conf এর মতো কিছুতে উত্স তৈরি করেন - এবং সেই উত্সযুক্ত স্ক্রিপ্টে অ্যাসাইনমেন্ট স্টেটমেন্ট থাকতে পারে যা আপনি চান মানগুলি ওভাররাইড করে। সোর্সযুক্ত স্ক্রিপ্টটি # / বিন / ব্যাশ দিয়ে শুরু না হওয়ায় এটি সরাসরি চালানোর জন্য উত্সাহ দেওয়া হয় না।
লরেন্স

সুতরাং উত্স এক ধরণের এটি একটি বিশ্বব্যাপী স্কোপে চালানোর মতো, এবং কার্যকর করা একটি নতুন স্থানীয় সুযোগ তৈরি করে। এটি কি কোনও স্ক্রিপ্টের কোনও ক্রিয়ায় বাড়ানো যেতে পারে? কোনও ফাংশন সম্পাদন করতে (সাধারণত) বা এটি "উত্স" করতে?
aliteralmind

2
ব্যবহার source myscript.shএবং এর মধ্যে পার্থক্য আছে . myscript.sh?
হলোয়ে

2
ব্যাশ ব্যবহার করলে কার্যত কোনও পার্থক্য নেই। উত্স বাশ মধ্যে বিন্দু একটি উপনাম।
লেসমানা

1
আমি এটি পছন্দ করি যখন লোকেরা এ জাতীয় বিস্তৃত উদাহরণ সরবরাহ করে যাতে আমার মতো লিনাক্স নবীরাও বুঝতে পারে। ধন্যবাদ!
জুলিয়াস

21

স্ক্রিপ্ট কার্যকর করা একটি পৃথক শিশু প্রক্রিয়াতে চালিত করে, অর্থাত্, স্ক্রিপ্টটি প্রক্রিয়া করার জন্য শেলের একটি পৃথক দৃষ্টিকোণ চাওয়া হয়। এর অর্থ হ'ল স্ক্রিপ্টে বর্ণিত কোনও পরিবেশের ভেরিয়েবল ইত্যাদি প্যারেন্ট (বর্তমান) শেলটিতে আপডেট করা যাবে না

স্ক্রিপ্ট উত্সাহিত করার অর্থ এটি বর্তমান শেল নিজেই এটিকে বিশ্লেষণ ও সম্পাদন করে। এটি যেন আপনি স্ক্রিপ্টের বিষয়বস্তু টাইপ করেছেন। এই কারণে, স্ক্রিপ্টটি উত্সাহিত হচ্ছে কার্যকর করার দরকার নেই। তবে এটি কার্যকর করতে হবে যদি আপনি অবশ্যই এটি সম্পাদন করছেন।

যদি বর্তমান শেলটিতে আপনার অবস্থানগত তর্ক থাকে তবে সেগুলি অপরিবর্তিত রয়েছে।

সুতরাং আমি যদি একটি ফাইল থাকে a.sh:

echo a $*

এবং আমি করি:

$ set `date`
$ source ./a.sh

আমি এরকম কিছু পাই:

a Fri Dec 11 07:34:17 PST 2009

যেখানে:

$ set `date`
$ ./a.sh

আমাকে দেয়:

a

আশা করি এইটি কাজ করবে.


5
যদিও এই উত্তরটি প্রতিটি উপায়েই সঠিক, আমি এটি বুঝতে খুব কষ্ট পেয়েছি কারণ এটি অন্য ধারণা (অবস্থানগত পরামিতিগুলি নির্ধারণ) ব্যবহার করে প্রদর্শিত হয়েছে, যা আমার মতে, নিজেই সোর্সিং এবং সম্পাদন করার পার্থক্যের চেয়ে আরও বিভ্রান্তিকর।
লেসমান

9

সোর্সিং মূলত কমান্ড প্রম্পটে স্ক্রিপ্টের প্রতিটি লাইন টাইপ করার মতোই ...

এক্সিকিউশন একটি নতুন প্রক্রিয়া শুরু করে এবং তারপরে স্ক্রিপ্টের প্রতিটি লাইন চালায়, কেবল বর্তমান পরিবেশটি যা ফিরে আসে তা পরিবর্তন করে।


6

উপরের পাশাপাশি, স্ক্রিপ্টটি সম্পাদনা ./myscriptকরার জন্য ফাইল ম্যাসক্রিপ্টের জন্য এক্সিকিউট করার অনুমতি প্রয়োজন হয় তবে সোর্সিংয়ের জন্য কোনও মৃত্যুদন্ডের অনুমতি প্রয়োজন হয় না। এজন্য chmod +x myscriptআগে প্রয়োজন হয় নাsource myscript


2
সত্য, তবে যদি এটি সমস্যা হয় তবে আপনি সর্বদা চালাতে পারেন bash myscript
ড্যানিয়েল অঙ্গুলিনির্দেশ

5

সোর্সিং আপনি স্ক্রিপ্টে সংজ্ঞায়িত সমস্ত অতিরিক্ত ভেরিয়েবল পান।
সুতরাং আপনার যদি কনফিগার বা ফাংশন সংজ্ঞা থাকে তবে আপনার উত্স হওয়া উচিত এবং কার্যকর করা উচিত নয়। মৃত্যুদণ্ড পিতামাতার পরিবেশ থেকে স্বাধীন।


3

যদি আমি সঠিক মনে করি, স্ক্রিপ্টটি কার্যকর #!করা একটি আর্গুমেন্ট হিসাবে স্ক্রিপ্ট ফাইলের সাথে লাইনে এক্সিকিউটেবলকে চালিত করে (সাধারণত একটি নতুন শেল শুরু করে এবং কার্যকরভাবে নতুন শেলটিতে স্ক্রিপ্টটি স্যোসারিং করে #!/bin/sh);
স্ক্রিপ্টটি সোর্সিং করা আপনার বর্তমান শেল পরিবেশের প্রতিটি লাইন কার্যকর করে, যা আপনার বর্তমান শেলটি পরিবর্তনের জন্য দরকারী (উদাহরণস্বরূপ, শেল ফাংশন এবং এক্সপোর্ট পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়নের জন্য একটি উপায় সরবরাহ করে)।


2

sourceকমান্ড প্রদান করা স্ক্রিপ্ট executes (এক্সিকিউটেবল অনুমতি নেই বাধ্যতামূলক নয় ) মধ্যে বর্তমান , শেল পরিবেশ যখন ./উপলব্ধ executes এক্সিকিউটেবল একটি স্ক্রিপ্ট নতুন শেল।

এছাড়াও, এই উত্তরটির উদাহরণ হিসাবে দেখুন: https://superuser.com/a/894748/432100

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.