আমি একটি সহজ স্ক্রিপ্ট লিখেছি। আমি যখন রান করি তখন আমি sh <myscriptname.sh>
সঠিক আউটপুট পেয়েছিলাম, কিন্তু যখন আমি চালাই ./<myscriptname.sh>
, তখন আমার একটি ত্রুটি হয়েছিল।
আমি sh
এবং যখন মধ্যে পার্থক্য কি ./
?
আমি একটি সহজ স্ক্রিপ্ট লিখেছি। আমি যখন রান করি তখন আমি sh <myscriptname.sh>
সঠিক আউটপুট পেয়েছিলাম, কিন্তু যখন আমি চালাই ./<myscriptname.sh>
, তখন আমার একটি ত্রুটি হয়েছিল।
আমি sh
এবং যখন মধ্যে পার্থক্য কি ./
?
উত্তর:
যখন আপনি কোনও স্ক্রিপ্ট স্ক্রিপ্ট ইন্টারপ্রেটার প্রোগ্রামে ফাইলের নাম দিয়ে চলেছেন, আপনি স্ক্রিপ্টটির সাহায্যে ইন্টারপ্রেটার প্রোগ্রামটি আর্গুমেন্ট হিসাবে প্রেরণে চালাচ্ছেন। উদাহরণস্বরূপ, এটি 'ফাইলের নাম.শ' আর্গুমেন্টের সাথে 'sh' প্রক্রিয়াটির মতো দেখাবে। sh
অনুবাদক ফাইলটি খোলার করা হয়।
অন্যদিকে আপনি যদি স্ক্রিপ্টটি নিজেই চালান, সিস্টেমটি নির্দিষ্ট করা দোভাষী প্রোগ্রামটিতে কল করে এবং স্ক্রিপ্ট সামগ্রীগুলিতে ফিড দেয়। এই ক্ষেত্রে প্রক্রিয়াটি কোনও আর্গুমেন্ট ছাড়াই 'ফাইলনাম.শ' এর মতো দেখায়।
আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে আপনার কাছে একটি ব্যাং লাইন রয়েছে:
#!/bin/bash
# bash script here
একটি ব্যাং লাইনটি স্ক্রিপ্টের একেবারে প্রথম লাইন এবং একই দুটি অক্ষর দিয়ে শুরু হয় #!
, এটি যখন স্ক্রিপ্টটি কার্যকর করার চেষ্টা করে তখন সিস্টেমটি পড়ে এবং তারপরে সিস্টেমটি স্ক্রিপ্টটি সাথে সাথে প্রোগ্রামে পাস করে। মনে রাখবেন যে এই লাইনটি বাশের সাথে করার মতো কিছুই নয় এবং অজগর এবং পার্লের জন্য কাজ করে, যদিও তারা খুব আলাদা ভাষা're আপনি #!/usr/bin/python
উদাহরণস্বরূপ ব্যবহার করুন এবং তারপরে অজগর কোড সহ এটি অনুসরণ করবেন।
আপনার স্ক্রিপ্টটি একবার হয়ে গেলে নিশ্চিত হয়ে নিন যে আপনি নির্বাহের অনুমতি নির্ধারণ করেছেন:
chmod a+x filename.sh
তারপরে আপনি স্ক্রিপ্টটিকে নিজস্ব প্রক্রিয়া হিসাবে চালাতে পারেন:
./filename.sh
বা একটি ভাল প্রোগ্রাম নাম সহ ফাইলটি একটি পরিচিত স্থানে রাখুন, /usr/sbin
যেকোন স্থান থেকে পছন্দ করুন এবং চালান:
sudo cp filename.sh /usr/sbin/program-name
program-name
এবং এটি যথাযথ অনুমতি সহ ঠুং ঠুংকা লাইন ব্যবহার করার ব্যবহারিক সুবিধা - এটি প্রায় স্থাপনার বিষয়ে । স্ক্রিপ্টটি চালানোর জন্য কোন প্রোগ্রামটি মনে রাখতে হবে তা ব্যবহারকারীদের স্ক্রিপ্ট চালানো খুব কঠিন। তারা যখনই এটি চালাতে চায় ততবার স্ক্রিপ্টকে একটি পুরো পথ দেওয়ার কথা মনে রাখবেন। কোথায় নির্বাণ হিসাবে /usr/local/bin
উদাহরণস্বরূপ, এবং এটি এক্সিকিউটেবল করে, আপনার স্ক্রিপ্ট ব্যবহার করার চেষ্টা মানুষের জন্য শোকের একটি ভয়াবহ অনেক সঞ্চয় করতে পারেন। এই প্রোগ্রামগুলি আপনার কম্পিউটারে সমস্ত ব্যবহারকারীদের জন্য উপলব্ধ হয়ে ওঠে ।
এটি সনাক্তকরণের জন্যও ভাল। আপনি যদি top
প্রোগ্রামটিতে যান তবে ব্যাং লাইন ছাড়াই একটি স্ক্রিপ্ট চলবে কেবল দোভাষীর নাম থাকবে bash
, perl
বা python
। তবে যদি কোনও স্ক্রিপ্ট সঠিক অনুমতি নিয়ে চালিত হয় তবে স্ক্রিপ্টটির নামটি দেখায়।
দ্রষ্টব্য: আপনি যদি সবার কাছে অ্যাক্সেসযোগ্য কোনও স্ক্রিপ্ট বিতরণ করতে চান তবে দয়া করে এটি ইনস্টল করার জন্য একটি ম্যান পৃষ্ঠা এবং একটি ডিবে প্যাকেজ তৈরি করুন। আমাদের অনলাইনে এলোমেলো স্ক্রিপ্টগুলির সংখ্যা হ্রাস করতে হবে এবং ডিবের সংখ্যা বৃদ্ধি করতে হবে যা আনইনস্টল করা যায়।
bash
না sh
।
PATH
।
/usr/local/bin
সম্ভবত এটি আরও ভাল /usr/sbin
- এটি নির্দেশ করে যে প্রোগ্রামটি বিতরণের অংশ হওয়ার চেয়ে এই মেশিনে স্থানীয়।
সংক্ষিপ্ত সংস্করণ:
sh
হ'ল কমান্ড-লাইন ইন্টারপ্রেটার (ড্যাশ)।
দৌড়াদৌড়ি sh my_script
স্ক্রিপ্টের ব্যাখ্যাকে ড্যাশ করে তোলে।
./
প্রথম লাইনটি দেখে কোন দোভাষী ব্যবহার করতে হবে তা জানার চেষ্টা করে। যেমন #!/bin/bash
, বা এমনকি #!/bin/ruby
(দৌড়ানোর বিপরীতে ruby my_script
)।
./
যা কিছু খুঁজে পায় তা নয়, এটি সিস্টেম এক্সিকিউশন পদ্ধতি যা ফাইলটির প্রথম দুটি বাইট দেখায়।
sh
এবং ফাইলটিতে একটি শ-ব্যাং থাকে, তখন এর অর্থ কী শ-ব্যাং উপেক্ষা করা হবে বা এটি শেলটি খুলবে যেখানে sh
লিঙ্কগুলি খুব বেশি এবং তারপরে সম্ভবত অন্য কোনও শেল বা এটি কী করবে :)?
পার্থক্যটি আপনি করছেন,
এর সাথে sh
, আপনি এমন একটি প্রোগ্রাম চালাচ্ছেন যা আপনার স্ক্রিপ্টের রেখাগুলিকে ঠিক একইভাবে ব্যাখ্যা করবে যেমন আপনি এটি টার্মিনালের ইন্টারেক্টিভ প্রম্পটে টাইপ করেছেন,
সঙ্গে ./
আপনি একটি শর্টকাট অভিমানী স্ক্রিপ্ট বর্তমান ডিরেক্টরির মধ্যে সঠিক এখানে আপনি বসে করছি এবং এটা এক্সিকিউটেবল হতে হবে (কারণ দৃষ্টান্তস্বরূপ, আপনি কি জারি করছেন chmod +x myscript.sh
), আপনি ভবিষ্যতে বার জন্য অমূল্য সময় সংরক্ষণ :-)
sh
ফাইলটি অবশ্যই অগত্যা কার্যকর করা যায় না।
তিনটি মূল কারণ রয়েছে যা আপনি একটি ত্রুটি পেয়ে যাচ্ছেন:
chmod +x <myscriptname.sh>
noexec
" মাউন্ট করা হয় ) /usr/local/bin
#!
লাইন একটি ত্রুটি রয়েছে #!/bin/sh
বা#!/bin/bash
যদি আপনার প্রথম লাইনটি সঠিক দেখাচ্ছে তবে এখনও কাজ করছে না, নিশ্চিত করুন যে ফাইলটির ডস লাইন শেষ নেই end
ত্রুটিটি এরকম কিছু দেখায়:
$ ./myscript.sh
bash: ./myscript.sh: /bin/bash^M: bad interpreter: No such file or directory
আপনি এটি চালিয়ে ঠিক করতে পারেন dos2unix <myscriptname.sh>
, বা আপনার যদি তা না থাকে
perl -p -i -e 's/\r\n$/\n/' <myscriptname.sh>
,।
এবং উত্তরটি হল sh খুব জনপ্রিয় শেলের নাম। তবে পুরানো এবং অন্যদের দ্বারা প্রতিস্থাপিত। আজকাল মেশিনে ইনস্টল করা শেলগুলির সাথে sh যুক্ত রয়েছে। যেমন আমি বাশ লাগিয়েছি। Sh থেকে যে কোনও শেল চালানো সাধারণত 'শেল' আচরণের সাথে কিছু 'উপযুক্ততা' মোডকে ট্রিগার করে।
সুতরাং সমাধান বেশ সহজ। Sh কমান্ডের পিছনে কী রয়েছে তা দেখুন (ls -al / bin / sh), এবং #! / বিন / যাইহোক_আপনি_ফাইন্ডকে প্রথম লাইন হিসাবে রাখুন (বা যদি আপনার স্ক্রিপ্টে এটি সম্পাদনা করতে পারে তবে)।
এবং বিকল্পভাবে স্ক্রিপ্টে কিছু বাগ থাকতে পারে। শি দ্বারা পূরণ করা নির্ভরতা যেমন, কিন্তু দোভাষী যে আসলে ব্যবহৃত হয় না।
mkdir ~/bin ; cp myscript.sh ~/bin/
echo "export PATH="$PATH:/home/$USER/bin" >> ~/.profile ; source ~/.profile ;
না /usr/sbin
, এটি অপ্রয়োজনীয় প্রশাসনিক সরঞ্জামগুলির জন্য, /usr/local/bin
আপনি যদি না চান তবে এটি একটি ভাল পছন্দ ~/bin/
, তবে sudo
যতটা সম্ভব এড়ানো এড়ানো পরামর্শ দেওয়া হয়।
~/.profile
ইতিমধ্যে কোড যুক্ত করার জন্য ইতিমধ্যে কোড ~/bin
রয়েছে PATH
। অন্য নোটে, স্ক্রিপ্টগুলিতে এক্সটেনশনগুলি রাখবেন না।
ls ~/bin/|wc -l = 428
) আমি সেখানে প্রচুর স্টাফ
/bin
এবং /usr/bin
আপনি দেখতে পাবেন যে তারা এক্সটেনশন ব্যবহার করে না।