.Sh ফাইল চালানোর আগে আমাকে শ লাগাতে হবে কেন?


16

আমি যখন .shটার্মিনালে ফাইল চালাতে চাই, তখন আমি shতাদের সামনে রাখা দরকার ।

এটি এড়ানোর কোনও উপায় নেই, এবং এভাবে টাইপিং সংরক্ষণ করুন?


3
আমি আমার শেল স্ক্রিপ্টগুলিতে রাখার জন্য bin / বিন এ একটি ফোল্ডার তৈরি করেছি এবং এটি আমার $ PATH এ রেখেছি এবং স্বয়ংক্রিয়ভাবে নির্বাহের অনুমতিগুলি সেট করতে to / বিন ফোল্ডারের সাথে একটি ফোল্ডার অ্যাকশন সংযুক্ত করেছি কারণ এটি করতে ভুলে যাওয়া এত সহজ।
কায়ডেল

উত্তর:


22

আপনি যদি শেল থেকে আপনার স্ক্রিপ্টটি চালাচ্ছেন তবে এই উত্তরটিতে #!/bin/shউল্লিখিত শিব্যাংয়ের আসলে আপনার প্রয়োজন নেই - ওএস এক্স সহ আমি যে ইউনিক্স-মতো সিস্টেম ব্যবহার করেছি সেগুলি ডিফল্ট হয়ে যাবে/bin/sh যদি কোনও দোভাষী নির্দিষ্টভাবে নির্দিষ্ট না করা তবে যাবে ( যদিও এটি একটি ভাল ধারণা হিসাবে নন-শেলগুলি আপনি শিবাং না দিলে কীভাবে আপনার স্ক্রিপ্টটি কার্যকর করা যায় তা জানেনা)

.shআপনারও এক্সটেনশনের দরকার নেই । আপনাকে এক্সিকিউটেবল অনুমতিগুলি নির্ধারণ করতে হবে, যেমন

$ chmod +x script.sh

( $এটি শেল প্রম্পট; আমি ইন্টারেক্টিভ শেলকে আপনি যে আদেশ দিয়েছেন তা চিত্রিত করার জন্য এটি ব্যবহার করছি it এটি টাইপ করবেন না!)

যাইহোক, আমি মনে করি আপনার বিভ্রান্তিটি হ'ল এটি হ'ল আপনি একটি স্ক্রিপ্ট তৈরি করেছেন, উদাহরণস্বরূপ script.sh, বর্তমান ডিরেক্টরিতে, এবং কেবল টাইপ করে এটি কার্যকর করার চেষ্টা করছেন script.sh। যেমন

$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found

( ^Dমানে control- D। আপনি ইউনিক্স ব্যবহার করে অনেক লিখিতকরণে এই স্বরলিপিটি খুঁজে পাবেন))

এটা সত্য যে script.shএই ক্ষেত্রে একটি শেল স্ক্রিপ্ট শুধুমাত্র অর্ধেক সমস্যা হয়; আপনার আসল সমস্যাটি হ'ল ডিফল্টরূপে, শেলটি কোনও প্রোগ্রামের জন্য বর্তমান ডিরেক্টরি অনুসন্ধান করবে না। তবে, এটি কাজ করে:

$ sh script.sh
hello, world

কারণ shস্ক্রিপ্টটিকে আর্গুমেন্ট হিসাবে গ্রহণ করছে।

আপনি বর্তমান ডিরেক্টরিতে কোনও চালনাতে chmod +xচান তা উল্লেখ করে আপনি বর্তমান ডিরেক্টরিতে কোনও স্ক্রিপ্ট কার্যকর করতে পারেন - আবার, যে কোনও নির্বাহযোগ্য –, যদি এটি নির্বাহযোগ্য (যেমন ) হিসাবে চিহ্নিত হয়:

$ ./script.sh
hello, world

আপনি স্ক্রিপ্টটিকে একটি ডিরেক্টরিতেও স্থানান্তর করতে পারেন PATH। আমি /usr/local/binযদি আপনার স্ক্রিপ্টটি সিস্টেম-ব্যাপী ব্যবহারের উদ্দেশ্যে বা binআপনার বাড়ির কোনও ডিরেক্টরি যদি স্ক্রিপ্টটি কেবল আপনার জন্য থাকে তবে এই জন্য সুপারিশ করছি। পরেরটির জন্য আপনার নিজের বাড়ির ডিরেক্টরিতে নিম্নলিখিত লাইনগুলি যুক্ত করে $HOME/binআপনার নতুন বিন ডিরেক্টরিতে প্রসারিত আপনার যুক্ত করা দরকার :PATH.profile

PATH=$HOME/bin:$PATH
export PATH

অবশেষে, আপনি যদি চান তবে আপনার নিজের সাথে বর্তমান ডিরেক্টরিটি যুক্ত করতে পারেন, PATHযা আপনাকে কেবলমাত্র script.shকোনও এক্সিকিউটেবল containing অথবা টাইপ করে একটি ডিরেক্টরিতে যেতে দেবে

$ script.sh

এটি কার্যকর করা। তবে, আমি এই অনুশীলনটির প্রস্তাব দিচ্ছি না , কারণ আক্রমণকারী এখন যে এক্সিকিউটেবল স্ক্রিপ্ট (নামকরণ, বলুন ls) আপনি রাখবেন এমন একটি ডিরেক্টরিতে ফেলে দিয়ে নির্বিচারে চালানো চালিয়ে যেতে পারে trick আপনি যদি সত্যিই এটি করতে চান তবে, আপনার নিম্নলিখিতটিতে কেবল যুক্ত করুন .profile:

PATH=.:$PATH
export PATH

স্থাপন করা '.' শুরুতে পরিবর্তে AT पथ শেষে এবং এখন আপনাকে ভুত 'ls' নিয়ে চিন্তা করার দরকার নেই। (যদিও কেউ যদি আপনার সিস্টেমে প্রবেশ করতে পারে তবে আপনার কাছে আরও বড় সমস্যা রয়েছে))
টিজে লুওমা

2
@TJ, কিন্তু আপনি কি ভালো জিনিস সম্পর্কে চিন্তা করতে হবে slবা llsবা l... অর্থাত, টাইপস। শুধু .বাইরে ছেড়ে দিন $PATH। এছাড়াও, আপনি অবশ্যই আপনার সিস্টেমের প্রত্যেককে বিশ্বাস করতে (বা করা উচিত নয়)। উদাহরণস্বরূপ, আছে কিছু কাজে লাগান যে কিছু ডিরেক্টরির মধ্যে একটি অবাধ ফাইল ড্রপ একটি আক্রমণকারী পারবেন অনুমান করা, কিন্তু তারা প্রয়োজন আপনি থেকে ধাপে ধাপে বৃদ্ধি করার জন্য যে ফাইল চালানো একটি উন্নততর কাজে লাগান (যেমন, ডেটা সংগ্রহ করি ও ফোন বাড়িতে)। গভীরতায় প্রতিরক্ষা!
রিড

@ টিজেলুওমা @ রিড কী বলেছে, প্লাস মনে রাখবেন যে ইউনিক্স সিস্টেমের জন্য ব্যক্তিগত ওএস এক্স ডেস্কটপের বাইরে অনেকগুলি ব্যবহারের মামলা রয়েছে। এটি চেষ্টা করে দেখেনি, তবে আমি বাজি দিয়েছি এমনকি অতিথি অ্যাকাউন্টে items আইটেমগুলির মধ্যে একটি /tmpবা অন্য কোনও বিশ্ব-লিখনযোগ্য ডিরেক্টরিতে থাকতে পারে।
zigg

আপনি যদি এমন কোনও সিস্টেম ব্যবহার করছেন যেখানে অন্যান্য ব্যক্তিদের আপনি যে ডিরেক্টরি ব্যবহার করেন সেগুলিতে অ্যাক্সেস থাকে তবে আপনার কাছে আরও বড় সমস্যা রয়েছে।
টিজে লুওমা

@ টিজে লুওমা আপনি তখন কোনও ইউনিক্স সিস্টেমে একাধিক অ্যাকাউন্ট ব্যবহার করবেন না। /tmpইত্যাদি। অঞ্চল নিয়ে আসা।
zigg

10

shস্ক্রিপ্ট ফাইলটি এক্সিকিউটেবল হিসাবে চিহ্নিত করা থাকলে আপনাকে কল করার দরকার নেই । সেক্ষেত্রে আপনি বিদ্যমান শেল থেকে অন্য কোনও কমান্ডের মতো আপনিও এটি আমার নাম বলতে পারবেন।


সম্পূর্ণরূপে যথাযথ হতে, আপনি দুটি জিনিস করতে চাইবেন:

  1. আপনার স্ক্রিপ্টের শীর্ষে একটি শেবাং নির্দেশিকা অন্তর্ভুক্ত করতে আপনার স্ক্রিপ্টটি সম্পাদনা করুন :

    #!/bin/sh

    ... এটি স্ক্রিপ্টটি চালনার জন্য কোন দোভাষীকে ব্যবহার করতে হবে তা শেলকে বলবে; এই ক্ষেত্রে, কার্যকর /bin/sh

  2. Chmod কমান্ড দিয়ে আপনার দ্বারা স্ক্রিপ্টটি সম্পাদনযোগ্য হিসাবে চিহ্নিত করুন :

    chmod u+x scriptname.sh

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


শেবাংগুলি আসলে তাদের জন্য প্রয়োজনীয় নয় /bin/sh, যদিও তারা ক্ষতি করে না।
zigg

@ জিগগ - আপনি সঠিক আমি আশা করি ক্রিস আমার সম্পাদনাগুলিকে কিছু মনে করবে না ... নুকে বা পুনরায় সম্পাদনা পছন্দ অনুযায়ী: -0
বিমিকে

@ বিমিকে সম্পাদনাগুলি আমার পক্ষে কাজ করে। শেবাংদের ক্ষেত্রে, আমার অভ্যাসটি সর্বদা নির্দিষ্ট করা ছিল কারণ আমি kshআমার দিনগুলিতে এইচপি-ইউএক্স-এ অনেকগুলি স্ক্রিপ্ট লিখতাম - তবে এটি জেনে রাখা ভাল যে এটি কঠোরভাবে প্রয়োজনীয় নয়।
ক্রিস ডাব্লু। রিয়া

1
আমি মনে করি শেবাং প্রয়োজনীয়তা সম্পর্কে আমার পূর্ববর্তী বিবৃতিটি থেকে ফিরে যেতে হবে (যদিও আমার উত্তর এখনও বাকী রয়েছে) আপনি শেল থেকে শেবাং-কম স্ক্রিপ্ট চালাতে পারেন তবে আপনি যদি execসিস্কেল ব্যবহার করেন তবে আপনি পাবেন ENOEXEC(এক্সিকিউট ফর্ম্যাট ত্রুটি )। এই সম্পর্কে দুঃখিত, @ বিমিক, @ ক্রিসডাব্লু .আর। আমি এখন আমার উত্তর সম্পাদনা করতে যাচ্ছি।
zigg
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.