স্ক্রিপ্ট চালাতে। / এবং sh এর মধ্যে পার্থক্য কী?


71

আমি একটি সহজ স্ক্রিপ্ট লিখেছি। আমি যখন রান করি তখন আমি sh <myscriptname.sh>সঠিক আউটপুট পেয়েছিলাম, কিন্তু যখন আমি চালাই ./<myscriptname.sh>, তখন আমার একটি ত্রুটি হয়েছিল।

আমি shএবং যখন মধ্যে পার্থক্য কি ./?


15
"আমি একটি ত্রুটি পেয়েছি" কেবল বলার পরিবর্তে, আপনি ত্রুটিটি যা বলেছে তা এতে পেস্ট করলে এটি সহায়তা করবে।
স্প্যাশহিট

উত্তর:


67

যখন আপনি কোনও স্ক্রিপ্ট স্ক্রিপ্ট ইন্টারপ্রেটার প্রোগ্রামে ফাইলের নাম দিয়ে চলেছেন, আপনি স্ক্রিপ্টটির সাহায্যে ইন্টারপ্রেটার প্রোগ্রামটি আর্গুমেন্ট হিসাবে প্রেরণে চালাচ্ছেন। উদাহরণস্বরূপ, এটি 'ফাইলের নাম.শ' আর্গুমেন্টের সাথে '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। তবে যদি কোনও স্ক্রিপ্ট সঠিক অনুমতি নিয়ে চালিত হয় তবে স্ক্রিপ্টটির নামটি দেখায়।

দ্রষ্টব্য: আপনি যদি সবার কাছে অ্যাক্সেসযোগ্য কোনও স্ক্রিপ্ট বিতরণ করতে চান তবে দয়া করে এটি ইনস্টল করার জন্য একটি ম্যান পৃষ্ঠা এবং একটি ডিবে প্যাকেজ তৈরি করুন। আমাদের অনলাইনে এলোমেলো স্ক্রিপ্টগুলির সংখ্যা হ্রাস করতে হবে এবং ডিবের সংখ্যা বৃদ্ধি করতে হবে যা আনইনস্টল করা যায়।


1
আপনি একটি ব্যক্তিগত বিন ফোল্ডারও ব্যবহার করতে পারেন: আপনার হোম ফোল্ডারে লগ আউট করে একটি লিনিক ফোল্ডার তৈরি করুন এবং ফিরে লগ ইন করুন এবং তারপরে sh অথবা ./ ছাড়া আপনার এই ফোল্ডারে কোনও স্ক্রিপ্ট চালানো উচিত।
পাপুকাইজা

অবশ্যই, তবে আপনার রাস্তায় আপনার হোম ফোল্ডারটি যুক্ত করা মাথা ব্যাথার মতো হতে দেখা যায়। জিনিসগুলি ইনস্টল করা ভাল। স্থানীয় প্যাকেজ ইনস্টল করার জন্য ডিফল্টরূপে to / .local / bin যোগ করার বিষয়ে কিছু কথা হয়েছিল যদিও।
মার্টিন ওভেনস-ডক্টরমো

লক্ষ্য করুন যে ডিফল্ট দোভাষী হলেন bashনা sh
নাথান ওসমান

1
স্ক্রিপ্টগুলিতে এক্সটেনশানগুলি রাখবেন না, বিশেষত আপনি যখন এটি putোকাতেন না তখন PATH
গিরিহা

1
/usr/local/binসম্ভবত এটি আরও ভাল /usr/sbin- এটি নির্দেশ করে যে প্রোগ্রামটি বিতরণের অংশ হওয়ার চেয়ে এই মেশিনে স্থানীয়।
গ্লেন জ্যাকম্যান 20

41

সংক্ষিপ্ত সংস্করণ:

  • shহ'ল কমান্ড-লাইন ইন্টারপ্রেটার (ড্যাশ)।
    দৌড়াদৌড়ি sh my_scriptস্ক্রিপ্টের ব্যাখ্যাকে ড্যাশ করে তোলে।

  • ./প্রথম লাইনটি দেখে কোন দোভাষী ব্যবহার করতে হবে তা জানার চেষ্টা করে। যেমন #!/bin/bash, বা এমনকি #!/bin/ruby(দৌড়ানোর বিপরীতে ruby my_script)।


7
এটি আসলে ./যা কিছু খুঁজে পায় তা নয়, এটি সিস্টেম এক্সিকিউশন পদ্ধতি যা ফাইলটির প্রথম দুটি বাইট দেখায়।
মার্টিন ওভেনস-ডক্টরমো

9
একেবারে। এগুলির একটি খুব দীর্ঘ ব্যাখ্যা এখানে । আমি বাস্তববাদী হচ্ছি :)
স্টেফানো প্যালাজো

আপনি যখন ব্যবহার করেন shএবং ফাইলটিতে একটি শ-ব্যাং থাকে, তখন এর অর্থ কী শ-ব্যাং উপেক্ষা করা হবে বা এটি শেলটি খুলবে যেখানে shলিঙ্কগুলি খুব বেশি এবং তারপরে সম্ভবত অন্য কোনও শেল বা এটি কী করবে :)?
ইনি

5

পার্থক্যটি আপনি করছেন,

  • এর সাথে sh, আপনি এমন একটি প্রোগ্রাম চালাচ্ছেন যা আপনার স্ক্রিপ্টের রেখাগুলিকে ঠিক একইভাবে ব্যাখ্যা করবে যেমন আপনি এটি টার্মিনালের ইন্টারেক্টিভ প্রম্পটে টাইপ করেছেন,

  • সঙ্গে ./আপনি একটি শর্টকাট অভিমানী স্ক্রিপ্ট বর্তমান ডিরেক্টরির মধ্যে সঠিক এখানে আপনি বসে করছি এবং এটা এক্সিকিউটেবল হতে হবে (কারণ দৃষ্টান্তস্বরূপ, আপনি কি জারি করছেন chmod +x myscript.sh), আপনি ভবিষ্যতে বার জন্য অমূল্য সময় সংরক্ষণ :-)


3
সংক্ষিপ্ত বিবরণে একমাত্র ব্যক্তি হওয়ার জন্য +1 ফাইলটি সম্পাদনযোগ্য হতে হবে।
মাইকেল

2
নোট করুন যে shফাইলটি অবশ্যই অগত্যা কার্যকর করা যায় না।
ইনি

3

তিনটি মূল কারণ রয়েছে যা আপনি একটি ত্রুটি পেয়ে যাচ্ছেন:

  • ফাইলটি ঠিক করার জন্য এক্সিকিউটেবল
    রান নয়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>,।


0

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

সুতরাং সমাধান বেশ সহজ। Sh কমান্ডের পিছনে কী রয়েছে তা দেখুন (ls -al / bin / sh), এবং #! / বিন / যাইহোক_আপনি_ফাইন্ডকে প্রথম লাইন হিসাবে রাখুন (বা যদি আপনার স্ক্রিপ্টে এটি সম্পাদনা করতে পারে তবে)।

এবং বিকল্পভাবে স্ক্রিপ্টে কিছু বাগ থাকতে পারে। শি দ্বারা পূরণ করা নির্ভরতা যেমন, কিন্তু দোভাষী যে আসলে ব্যবহৃত হয় না।


0
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। অন্য নোটে, স্ক্রিপ্টগুলিতে এক্সটেনশনগুলি রাখবেন না।
গিরিহা

1
আমি <myscriptname.sh> উল্লেখ করছি, তবে স্ক্রিপ্টগুলিতে এক্সটেনশন না রাখার যুক্তি কী? আমি সাধারণত এটি করি কারণ এর মতো সরল পাঠ্য ফাইলগুলি দৃশ্যমান থাকার ফলে আমি বাইনারিগুলি সম্পাদনা করার চেষ্টা করতে পারি না যা আমি ~ / bin / এও রাখি। ( ls ~/bin/|wc -l = 428) আমি সেখানে প্রচুর স্টাফ
রেখেছি

কল্পনা করুন আপনি একটি নির্দিষ্ট কাজ অর্জনের জন্য একটি স্ক্রিপ্ট লিখেছেন। তারপরে আপনি বুঝতে পারবেন যে পাইথনটিতে এই বিশেষ স্ক্রিপ্টটি লেখা এটি আরও দক্ষ করে তুলবে, সুতরাং আপনি এটিকে অজগরটিতে পুনরায় লিখবেন। এখন আপনার দুটি পছন্দ আছে। 1) এখন খুব বিভ্রান্তিমূলক .sh- এক্সটেনশন ছেড়ে দিন, বা 2) স্ক্রিপ্টটির নাম পরিবর্তন করুন এবং নতুন নামটি ব্যবহার করতে স্ক্রিপ্টের সমস্ত ব্যবহার সন্ধান করুন এবং প্রতিস্থাপন করুন। আপনি যদি স্ক্রিপ্টগুলিতে লক্ষ্য করেন /binএবং /usr/binআপনি দেখতে পাবেন যে তারা এক্সটেনশন ব্যবহার করে না।
গিরিহা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.