উত্তর:
আপনি যদি ব্যবহার
sh ./<script>.run
/bin/sh
(সাধারণত একটি বোর্ন শেল) স্ক্রিপ্টটি চালাতে ব্যবহৃত হত। অবশ্যই এটি কেবল তখনই কাজ করে যদি স্ক্রিপ্টটি বোর্ন শেলের জন্য লেখা থাকে। কখনও কখনও লিনাক্সের শেল স্ক্রিপ্টগুলিতে বোর্ন শেলের পরিবর্তে বাশের প্রয়োজন হয়, সুতরাং এটি শেল স্ক্রিপ্ট হলেও এটি কাজ করতে পারে না।
আপনি যদি ব্যবহার
./<script>.run
প্রোগ্রামটি চালানোর জন্য কোন প্রোগ্রামটি ব্যবহার করতে হবে তা জানতে কার্নেল শ্যাবাং লাইনের দিকে তাকাবে । সুতরাং এটি কোনও বাশ, পার্ল, পাইথন বা অন্য কোনও স্ক্রিপ্ট হলেও এটি কাজ করে।
সুতরাং এটি সাধারণত স্ক্রিপ্ট চালানোর জন্য পছন্দসই উপায়।
যতক্ষণ না এটি একটি sh
(ড্যাশ, বা সমমানের) শেল স্ক্রিপ্ট, না, বাহ্যিক কোনও পার্থক্য নেই।
সমস্যাটি হ'ল .run
গ্যারান্টি দেয় না। এটি বাইনারি হতে পারে। এটি বাশ বা পাইথন বা পিএইচপি বা যা কিছু হতে পারে; তাদের সবার শেলের স্ক্রিপ্ট হ্যাশ-ব্যাং রয়েছে। যদি আপনি এটিকে অন্ধভাবে চাপিয়ে দেন তবে sh
কে কী হতে পারে তা জানে। এটি সম্ভবত ত্রুটিযুক্ত হয়ে যাবে তবে এটি দুর্ঘটনাক্রমে ক্ষতিকারক কোডটি চালানো যেতে পারে।
দ্বারা chmod
টিং এটা (সঞ্চালনের অনুমতি বিট সক্রিয় করতে) এবং তারপর চলমান ./script.run
, আপনি এটি চলমান সম্ভাব্য সর্বোত্তম সম্ভাবনা দেব। যদি এটি একটি শেল স্ক্রিপ্ট হয় তবে এর হ্যাশ-ব্যাং সঠিকভাবে পার্স হবে এবং এটি যদি বাইনারি কার্যকর হয় তবে এটি কেবল নেটিভভাবে চালানো হবে।
দুটি পদ্ধতি প্রায়শই একই আচরণ করতে পারে তবে খুব আলাদা different
sh ./script
sh
একটি আর্গুমেন্ট দিয়ে কমান্ডটি চালায় ./script
, যা প্রদত্ত স্ক্রিপ্টটি কার্যকর করতে ঘটে .. এমনকি স্ক্রিপ্টটি আসলে sh
স্ক্রিপ্ট না হলেও (খারাপ)
./script
প্রদত্ত ফাইলটি কার্যকর করে। এটি "শেবাং" লাইনটি অনুসন্ধান করে কোন আদেশটি চালাবে তা নির্ধারণ করার জন্য এটি করে । যদি অনির্ধারিত থাকে তবে এটি ব্যবহার করে sh
( এটি কখনও কখনও দুটি পদ্ধতি একই কাজ করে) তবে প্রায়শই আলাদা দোভাষী বর্ণনা করা হয় ..
উদাহরণস্বরূপ, যদি filename
নিম্নলিখিতগুলি থাকে:
#!/usr/bin/python
print "This is a Python script!"
.. তারপর দুটি কমান্ড খুব আলাদা:
$ sh script
script: line 3: print: command not found
$ chmod +x script
$ ./script
This is a Python script!
যদি শেবাং লাইন না থাকে তবে দুটি একই:
$ cat script
echo "This is an sh script"
$ sh ./script
This is an sh script
$ ./script
This is an sh script
একটি গুরুত্বপূর্ণ পার্থক্য হ'ল যদি আপনার হ্যাশবাং লাইনের প্যারামিটার থাকে। উদাহরণস্বরূপ, যদি স্ক্রিপ্টটি শুরু হয়
#!/bin/bash -e
... এবং আপনি এটি বাহ্যিকভাবে ব্যবহার করে চালান sh
বা bash
, সেই লাইনটি একটি মন্তব্য হিসাবে ব্যাখ্যা করা হবে এবং উপেক্ষা করা হবে, সুতরাং -e
প্যারামিটার (ব্যর্থতার প্রস্থান) প্রক্রিয়া করা হবে না। সুতরাং, নিম্নলিখিত স্ক্রিপ্ট দেওয়া:
#!/bin/bash -e
echo Hello
false
echo goodbye
এর জন্য আউটপুটটি ./script
কেবল "হ্যালো" হবে, তবে এর ফলাফল আউটপুট অনুসরণ sh script
করবে যা সম্ভবত উদ্দেশ্য ছিল না।Hello
goodbye
এটি, set -e
যাইহোক , কেন আপনাকে সর্বদা পৃথক বিবৃতি ব্যবহার করা উচিত (এটি যাইহোক একটি ভাল ধারণা - প্রায়শই না, যদি মিড-স্ক্রিপ্টের সমস্যা হয় তবে আপনি এটি উপেক্ষা করবেন না)।