"বাশ স্ক্রিপ্ট.শ" এবং "./script.sh" চালানোর মধ্যে পার্থক্য কী?


42

স্ক্রিপ্ট.শ যদি কিছু সাধারণ কিছু হয়

#!/bin/bash
echo "Hello World!"

স্ক্রিপ্ট চালানোর জন্য কি কোনও পছন্দনীয় উপায় আছে? আমি মনে করি আপনাকে প্রথমে এটি chmod করতে হবে যাতে এটি কার্যকর হয়?

উত্তর:


56

আপনার নির্দিষ্ট স্ক্রিপ্টের জন্য কোনওভাবেই কাজ করবে, কেবলমাত্র এতে ./script.shকার্যকরকরণ এবং পঠনযোগ্য বিটগুলির bash script.shপ্রয়োজন হয় , যখন কেবল পাঠযোগ্য বিট প্রয়োজন।


অনুমতিগুলির প্রয়োজনীয়তার পার্থক্যের কারণটি যে প্রোগ্রামটি আপনার স্ক্রিপ্টটিকে বোঝায় সেটিকে কীভাবে বোঝায়:

  • ./script.sh আপনার শেলটি ফাইলটিকে এমনভাবে চালিত করে যেন এটি একটি নিয়মিত সম্পাদনযোগ্য।

শেল নিজেই কাঁটাচামচ করে এবং একটি কল কল ব্যবহার execveকরে অপারেটিং সিস্টেমকে ফাইলটি কার্যকর করতে একটি সিস্টেম কল (যেমন ) ব্যবহার করে। অপারেটিং সিস্টেমটি ফাইলের অনুমতিগুলি পরীক্ষা করে (তাই এক্সিকিউশন বিটটি সেট করা দরকার) এবং প্রোগ্রাম লোডারকে অনুরোধটি ফরোয়ার্ড করে , যা ফাইলটি দেখায় এবং এটি নির্ধারণ করে কীভাবে তা নির্ধারণ করে। লিনাক্স সংকলিত এক্সিকিউটেবলগুলি একটি ELF যাদু নম্বর দিয়ে শুরু হয়, যখন স্ক্রিপ্টগুলি একটি #!( হ্যাশবাং ) দিয়ে শুরু হয় । একটি হ্যাশবাং শিরোনাম অর্থ ফাইলটি একটি স্ক্রিপ্ট এবং হ্যাশবাংয়ের পরে নির্দিষ্ট করা প্রোগ্রামের দ্বারা ব্যাখ্যা করা দরকার। এটি স্ক্রিপ্টকে কীভাবে স্ক্রিপ্টটির ব্যাখ্যা করতে হয় তা সিস্টেমকে বলতে দেয়।

আপনার স্ক্রিপ্টের সাহায্যে প্রোগ্রাম লোডার কমান্ড-লাইন আর্গুমেন্ট হিসাবে কার্যকর করবে /bin/bashএবং পাস করবে ./script.sh

  • bash script.shআপনার শেলটি চালানো bashএবং script.shকমান্ড-লাইন আর্গুমেন্ট হিসাবে পাস করে

সুতরাং অপারেটিং সিস্টেমটি লোড হবে bash(এমনকি script.shএটি তাকিয়েও নয়, কারণ এটি কেবল একটি কমান্ড-লাইন আর্গুমেন্ট)। তৈরি bashপ্রক্রিয়াটি তখন ব্যাখ্যা করবে script.shকারণ এটি কমান্ড-লাইন আর্গুমেন্ট হিসাবে পাস করেছে। যেহেতু script.shকেবলমাত্র bashনিয়মিত ফাইল হিসাবে পড়া হয় , তাই এক্সিকিউশন বিটের প্রয়োজন হয় না।


আমি ./script.shযদিও ব্যবহার করার পরামর্শ দিচ্ছি , কারণ স্ক্রিপ্টটির জন্য কোন দোভাষী দরকার তা আপনি হয়ত জানেন না। সুতরাং প্রোগ্রাম লোডার আপনার জন্য এটি নির্ধারণ করুন।


3
যদি এক্সিকিউটেবল বিটটি সেট না করা হয় তবে আপনি "। ./Script.sh" করে স্ক্রিপ্টটি চালাতে পারেন
কুকুর খাওয়ার বিড়াল বিশ্ব

1
@ ডগ আপনি সঠিক। ডট হ'ল বিল্ট-ইন কমান্ড 'উত্স' এর শর্টকাট, যা বর্তমান বাশ প্রক্রিয়াতে স্ক্রিপ্ট চালায়। সুতরাং কেবল পঠনযোগ্য বিট প্রয়োজন।
স্কাইডান

5
@Dogeatcatworld যখন সত্য, চলমান . ./script.shহিসাবে একই জিনিস না bash script.sh(অথবা ./script.sh। স্ক্রিপ্ট বিবেচনা করুন #!/usr/bin/python -V<সম্পর্কে newline> print test
ক্যাসি

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

6
দ্রষ্টব্য, আপনি যদি বর্তমান ডিরেক্টরিতে কোনও স্ক্রিপ্ট উত্স করে থাকেন তবে আপনাকে ./ ব্যবহার করার দরকার নেই ; শুধু বলুন . script.sh। তবে আমি সেই সমস্ত লোকদের সাথে একমত হই যারা .স্ক্রিপ্টগুলিতে কমান্ড ব্যবহার করে নিরুৎসাহিত করেন যা এইভাবে চাওয়া হয়নি। আমি অবাক হয়েছি যে কেউই এটি উল্লেখ করেনি, যদি স্ক্রিপ্টে exitকমান্ডগুলি থাকে এবং আপনি এটি উত্স করে থাকেন তবে এটি আপনাকে লগ আউট করতে পারে। স্ক্রিপ্টটি যদি একটি করে তবে একটি কম ভয়াবহ সমস্যা হবে cd, এটি প্যারেন্ট (ইন্টারেক্টিভ) শেলকেও প্রভাবিত করবে।
স্কট

18

bash script.shসরাসরি ব্যাশ ব্যবহার করে স্ক্রিপ্টটি আহ্বান করুন। কীভাবে কার্যকর করা যায় তা নির্ধারণ
./script.shকরতে শেবাং ব্যবহার করছে #!/bin/bash

আপনি যদি সত্যিই জানতে চান, কোন বাইনারি কার্যকর করা হয় আপনি যদি bash script.shএটি করেন তবে আপনি এটি খুঁজে পেতে পারেন which bash

সুতরাং আপনার উদাহরণে এটি কোনও পার্থক্য করে না। হ্যাঁ, আপনাকে chmod +x script.shসরাসরি এটির মাধ্যমে কার্যকর করতে সক্ষম হতে হবে ./script.sh


2
ঠিক আছে, এটি আপনার /bin/bashমধ্যে প্রথম এটি ধরে নেওয়া কোনও পার্থক্য করে bashনা $PATH
সিজেএম

তুমি ঠিক বলছো. এবং #!/bin/bash/bin/bash
শেবাং

আমার সিস্টেমে বাশ (সংস্করণ 4.2.37) এমনকি এক্সিকিউশন বিট সেট ছাড়াই স্ক্রিপ্টগুলি কার্যকর করে। আপনি কেন বলেন যে ফাঁসির বিট দরকার?
স্কাইডান

হ্যাঁ, মৃত্যুদন্ড কার্যকর করার জন্য কেবলমাত্র অনুরোধের মাধ্যমে প্রয়োজনীয় ./script.sh
xx4h

4

এই জাতীয় ফাইলগুলি মুছে দিন_সেলফ.শ. তৈরি করুন:

 #!/bin/rm

 echo I am still here!

sh Delete_Self.shআপনি দেখতে পাবেন যেহেতু "আমি এখনও এখানে আছি!" পিছনে প্রতিধ্বনিত

এটিকে এক্সিকিউটেবল করে তুলুন এবং চালনা করুন কারণ ./Delete_Self.shদেখবেন কোনও কিছুই আবার প্রতিধ্বনি হয় না, যখন ফাইলটি Delete_Self.shনিজেই চলে যায়।

সুতরাং পার্থক্যটি হ'ল:

  • bash script.sh# উপেক্ষা করবে! লাইন, কারণ স্ক্রিপ্ট.শ চালানোর জন্য বাশাকে প্রোগ্রাম হিসাবে নির্দিষ্ট করা হয়েছে।
  • ./script.shপড়বে #! প্রোগ্রাম চালানোর জন্য লাইন script.sh

সুন্দর উদাহরণের জন্য +1
থারোগুল

1

অন্যান্য উত্তর ছাড়াও মাধ্যমে একটি স্ক্রিপ্ট চালাতে মধ্যে পার্থক্য বুদ্ধিমান ইন ./script.sh(ঝ) এবং উৎস ./script.sh(২) উপকারী - (ঝ) সংস্করণ, যা কমান্ড চালানোর জন্য একটি নতুন শেল তৈরি করে যেহেতু (২) এটা রান বর্তমান শেল - যা কার্যকর হতে পারে যদি এক্সিকিউটেবল পরিবর্তনযোগ্য পরিবেশের পরিবর্তনশীলগুলি কার্যকর করতে সক্ষম হয় যা এক্সিকিউটেবল প্রস্থানের পরে সংরক্ষণ করা দরকার। উদাহরণস্বরূপ, পাইথন কনডা পরিবেশ সক্রিয় করতে নিম্নলিখিত ব্যবহার করা আবশ্যক:

source activate my_env

এনবি sourceআপনার মুখোমুখি হতে পারে তার আরেকটি বিকল্প হ'ল .বিল্টিন, অর্থাৎ

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