আমি কখন #! / বিন / বাশ এবং কখন #! / বিন / শ ব্যবহার করব?


104

শেল স্ক্রিপ্টের #!/bin/bashচেয়ে কখন বেশি উপযুক্ত #!/bin/sh?


55
আপনি যখন bashফাংশন এবং সিনট্যাক্সের চেয়ে shফাংশন এবং সিনট্যাক্স ব্যবহার করছেন।
মকুবাই


3
যদি এটি কাউকে সহায়তা করে, আমি লক্ষ্য করেছি যে এটির জীবন-যাপনের vimহাইলাইট হবে bashযদি আপনার স্ক্রিপ্টে শেবাং থাকে #!/bin/shbashব্যাশ-বৈশিষ্ট্যগুলির প্রয়োজন শুরু করার জন্য জিনিসগুলি যথেষ্ট লোমশ হয়ে উঠলে আমি কেবল এটিতে পরিবর্তন করব ।
সেলডমনিডি

@ সেলডমনিডি ডিফল্টরূপে এটি হাইলাইট করে এমন কিছু বিষয় যদিও কোনও পসিক্স শেল থেকে ঠিক আছে। $(...)বিশেষত দু: খজনক। এছাড়াও, তাদের মধ্যে কিছু সূক্ষ্ম [ <(...)এবং cmd >& fileহাইলাইট করার ক্ষেত্রে কোনও ত্রুটি পান না, উদাহরণস্বরূপ, কেবল তাদের সাথে বা ছাড়াও তারা কী বোঝায় তার জন্য বিশেষ হাইলাইটিং নেই g:is_bash]
র্যান্ডম 832

@ র্যান্ডম 832 দেখে মনে হচ্ছে সম্প্রতি এই বিষয়টির উপর ভিএম এর ইস্যু-ট্র্যাকারটিতে কিছু ক্রিয়াকলাপ হয়েছে ।
সেলডমনিডি

উত্তর:


150

সংক্ষেপে:

  • এখানে বেশ কয়েকটি শেল রয়েছে যা POSIX sh স্পেসিফিকেশনের সুপারসেট বাস্তবায়ন করে । বিভিন্ন সিস্টেমে /bin/shছাই, বাশ, ড্যাশ, কেএসএস, জেডএস, এবং সি এর লিঙ্ক হতে পারে। (এটি সর্বদা sh- সামঞ্জস্যপূর্ণ হবে - কখনই সিএসএস বা মাছ নয়))

  • যতক্ষণ আপনি shকেবল বৈশিষ্ট্যগুলিতে আঁকেন ততক্ষণ আপনি ব্যবহার করতে পারেন (এবং সম্ভবত #!/bin/shএটিও হওয়া উচিত) এবং স্ক্রিপ্টটি ঠিক কাজ করা উচিত, এটি কোন শেলই নয়।

  • যদি আপনি বাশ-নির্দিষ্ট বৈশিষ্ট্যগুলি (যেমন অ্যারেগুলি) ব্যবহার করা শুরু করেন তবে আপনার বিশেষভাবে ব্যাশের অনুরোধ করা উচিত - কারণ, যদিও /bin/shইতিমধ্যে আপনার সিস্টেমে ব্যাশ আহ্বান করা হয়েছে , এটি অন্য সবার সিস্টেমে নাও থাকতে পারে এবং আপনার স্ক্রিপ্টটি সেখানে চলবে না। (অবশ্যই এটি zsh এবং ksh এর ক্ষেত্রে প্রযোজ্য)) বাশিজম সনাক্ত করতে আপনি শেলচেক ব্যবহার করতে পারেন ।

  • এমনকি স্ক্রিপ্টটি শুধুমাত্র ব্যক্তিগত ব্যবহারের জন্য হলেও, আপনি লক্ষ্য করতে পারেন যে কিছু ওএস /bin/shআপগ্রেডের সময় পরিবর্তিত হয় - উদাহরণস্বরূপ ডেবিয়ানে এটি ব্যাশ ব্যবহৃত হত, তবে পরে এটি খুব ন্যূনতম ড্যাশ দ্বারা প্রতিস্থাপন করা হয়েছিল। স্ক্রিপ্টগুলি যা ব্যাশিজম ব্যবহার করেছিল তবে #!/bin/shহঠাৎ করে ভেঙে গেছে।

যাহোক:

  • এমনকি #!/bin/bashখুব সঠিক নয়। বিভিন্ন সিস্টেমে, ব্যাশ বাস পারে /usr/binবা /usr/pkg/binবা /usr/local/bin

  • আরও নির্ভরযোগ্য বিকল্প #!/usr/bin/env bash, যা $ PATH ব্যবহার করে। (যদিও envসরঞ্জামটি নিজেই কঠোরভাবে গ্যারান্টিযুক্ত নয়, /usr/bin/envতবুও এর চেয়ে বেশি সিস্টেমে কাজ করে /bin/bash))


10
চমৎকার উত্তর. আপনি এটি সিডব্লিউ তৈরি করতে চাইছেন?
মকুবাই

3
ব্যাশটি যদি চালানো হয় /bin/shতবে এটি shবৈশিষ্ট্যগুলি নকল করার চেষ্টা করবে ( ম্যান পৃষ্ঠাটি দেখুন ), নিশ্চিত নয় যে এই মোডে ব্যাশ নির্দিষ্ট বৈশিষ্ট্য উপলব্ধ। envসরঞ্জামটি একটি প্যাসিক্স সরঞ্জাম যা এটি বেশিরভাগ বিতরণে পাওয়া উচিত, তবে আমি নিশ্চিত না যে কেউ কেউ পিক্সিকে সম্মান না করে।
ব্রিস

8
না, প্রকৃতপক্ষে পসিক্স সুনির্দিষ্টভাবে বলেছে যে এটি এটি অনুমান করা যায় না /bin: " অ্যাপ্লিকেশনগুলিতে লক্ষ্য করা উচিত যে শেলের কাছে স্ট্যান্ডার্ড PATH / / bin / sh বা / usr / bin / sh হিসাবে ধরে নেওয়া যায় না এবং এটি নির্ধারণ করা উচিত পিএটিএইচ জিজ্ঞাসাবাদ করে গেটকনফ প্যাথ দ্বারা ফিরে এসেছিল, নিশ্চিত করে যে ফিরে আসা পথটি একটি নিখরচায় পথের নাম এবং অন্তর্নির্মিত শেল নয় "" এছাড়াও এই প্রশ্নটি দেখুন এবং বিশেষত এই উত্তরটি দেখুন
টেরডন

12
হুঁ, ঠিক আছে, এর মানে হল যে পসিক্স আসলে #!স্ক্রিপ্টগুলির কাজ করার জন্য কোনও পোর্টেবল উপায় সংজ্ঞায়িত করে না ?
মাধ্যাকর্ষণ

4
পসিক্স শ বোর্ন নয় : এটি বোর্নের প্রত্যক্ষ বংশধরের চেয়ে প্রাথমিক প্রারম্ভিক Ksh এর চেয়ে বেশি অনুশীলন। তাদের পার্থক্য করা সহজ: echo foo ^ catপসিক্স শি- foo ^ catতে নির্গত হয় এবং কেবল fooবোর্নেই (যেমনটি ^সেখানে পাইপের চরিত্র হিসাবে ) নির্গত হয়।
চার্লস ডাফি

18

আপনি আসলে আপনার স্ক্রিপ্টটি বিকাশ এবং ডিবাগ করতে ব্যবহৃত শেলের সাথে সম্পর্কিত শেবাং ব্যবহার করুন। অর্থাৎ যদি আপনার লগইন শেলটি থাকে bashএবং আপনি আপনার স্ক্রিপ্টটি আপনার টার্মিনালটিতে এক্সিকিউটেবল হিসাবে চালিত করেন তবে ব্যবহার করুন #!/bin/bash। কেবল ধরে নিবেন না যেহেতু আপনি অ্যারে ব্যবহার করেন নি (বা bashআপনি যে কোনও বৈশিষ্ট্য সম্পর্কে অবগত হন) তাই আপনি নিজের পছন্দমতো শেলটি বেছে নিতে নিরাপদ। শাঁসের মধ্যে অনেক সূক্ষ্ম পার্থক্য রয়েছে ( echo, ফাংশন, লুপগুলি, আপনি এটি নাম দিন) যা সঠিক পরীক্ষা ছাড়াই সনাক্ত করা যায় না।

এটি বিবেচনা করুন: যদি আপনি চলে যান #!/bin/bashএবং আপনার ব্যবহারকারীদের কাছে এটি না থাকে তবে তারা একটি পরিষ্কার ত্রুটি বার্তা দেখতে পাবে, এরকম কিছু

Error: /bin/bash not found

বেশিরভাগ ব্যবহারকারী উপযুক্ত প্যাকেজ ইনস্টল করে এক মিনিটের মধ্যে এটি ঠিক করতে পারেন। অন্যদিকে, আপনি যদি শেবাং দ্বারা প্রতিস্থাপন করেন #!/bin/shএবং এটি এমন কোনও সিস্টেমে পরীক্ষা করেন যেখানে /bin/shসিমলিংক রয়েছে /bin/bash, তবে আপনার ব্যবহারকারীরা bashসমস্যায় পড়বেন । তারা সম্ভবত একটি ক্রিপ্টিক ত্রুটি বার্তা দেখতে পাবেন:

Error in script.sh line 123: error parsing token xyz

এটি ঠিক হতে কয়েক ঘন্টা সময় নিতে পারে এবং তাদের কোন শেল ব্যবহার করা উচিত সে সম্পর্কে কোনও ধারণা পাওয়া যাবে না।

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


@ হস্তুর আমি আপনার মন্তব্য পাই না শিবাং অবশ্যই সংজ্ঞায়িত করবে যে কোন শেলটি স্ক্রিপ্টটি চালানোর জন্য ব্যবহৃত হবে, আপনি কি বলে আমার উত্তরটি অন্যথায় বোঝায়?
দিমিত্রি গ্রিগরিয়েভ

1
ভুলে যাও. "আপনি কেন ব্যবহার করতে চান" অংশটি আমি ভুল বুঝেছি ...
হাস্তুর

6

আপনার কেবল কখনও ব্যবহার করা উচিত #! /bin/sh

শেল স্ক্রিপ্টে আপনার কখনও বাশ (বা zsh, বা মাছ, বা ...) এক্সটেনশন ব্যবহার করা উচিত নয়।

আপনার কেবল শেল স্ক্রিপ্টগুলি কখনই লিখতে হবে যা শেল ভাষার যে কোনও বাস্তবায়নের সাথে কাজ করে (শেল নিজেই পাশাপাশি চলমান সমস্ত "ইউটিলিটি" প্রোগ্রাম সহ)। এই দিনগুলিতে আপনি সম্ভবত পসিক্স ১.২-২০০১ ( -2008 নয় ) কীভাবে শেল এবং ইউটিলিটিগুলি সক্ষম সেটির জন্য প্রামাণিক হিসাবে নিতে পারেন , তবে সচেতন থাকুন যে একদিন আপনার লিপিটি কোনও উত্তরাধিকার ব্যবস্থায় পোর্ট করার আহ্বান জানানো যেতে পারে (উদাঃ সোলারিস) বা এআইএক্স) যার শেল এবং ইউটিলিটিগুলি 1992 এর প্রচলিত জমাট ছিল।

কি, সিরিয়াসলি?!

হ্যাঁ গম্ভীরভাবে.

এই জিনিসটি এখানে: শেল একটি ভয়ানক প্রোগ্রামিং ভাষা। এটি কেবল একমাত্র বিষয়টির জন্য যাচ্ছিল তা হ'ল /bin/shএকমাত্র এবং একমাত্র স্ক্রিপ্ট দোভাষী যা প্রতিটি ইউনিক্সের ইনস্টলেশন নিশ্চয়তার সাথে থাকে।

এখানে অন্যান্য জিনিস আছে: কোর পার্ল 5 ব্যাখ্যাকারী (এর মধ্যে পুনরাবৃত্তির /usr/bin/perl) হল আরো একটি এলোমেলোভাবে নির্বাচিত ইউনিক্স ইনস্টলেশনের উপর উপলব্ধ হতে চেয়ে সম্ভবত (/(usr|opt)(/(local|sfw|pkg)?)?/bin/bashনেই। অন্যান্য ভাল স্ক্রিপ্টিং ভাষা (পাইথন, রুবি, নোড.জেএস, ইত্যাদি) - আমি এমনকি শেলের সাথে তুলনা করার সময় পিএইচপি এবং টিসিএলকে সেই বিভাগে অন্তর্ভুক্ত করব) বাশ এবং অন্যান্য বর্ধিত শেল হিসাবে প্রায় উপলব্ধ।

অতএব, যদি আপনার কাছে ব্যাশ স্ক্রিপ্ট লেখার বিকল্প থাকে তবে আপনার কাছে এমন একটি প্রোগ্রামিং ভাষা ব্যবহারের বিকল্প রয়েছে যা ভয়ঙ্কর নয়,

এখন সিম্পল শেল স্ক্রিপ্টস, ক্রোন জব বা অন্য কোনও কিছু থেকে ক্রমানুসারে কয়েকটি প্রোগ্রাম চালিত ধরণের, এগুলি শেল স্ক্রিপ্ট হিসাবে ছেড়ে দেওয়ার কোনও সমস্যা নেই। তবে সাধারণ শেল স্ক্রিপ্টগুলির জন্য অ্যারে বা ফাংশন বা [[এমনকি প্রয়োজন হয় না । এবং আপনার কেবলমাত্র জটিল শেল স্ক্রিপ্টগুলি লেখা উচিত যখন আপনার অন্য কোনও পছন্দ না থাকে। উদাহরণস্বরূপ, অটোকনফ স্ক্রিপ্টগুলি এখনও সঠিকভাবে শেল স্ক্রিপ্টগুলি। তবে এই স্ক্রিপ্টগুলি প্রোগ্রামটি কনফিগার করার সাথে সম্পর্কিত প্রতিটি অবতারে চলতে হবে /bin/sh। এবং এর অর্থ তারা কোনও এক্সটেনশন ব্যবহার করতে পারে না। এই দিনগুলিতে আপনাকে সম্ভবত পুরানো মালিকানাধীন ইউনিক্সগুলি সম্পর্কে যত্ন নেওয়ার দরকার নেই, তবে আপনার সম্ভবত বর্তমান ওপেন সোর্স বিএসডিগুলির যত্ন নেওয়া উচিত , যার কয়েকটি ইনস্টল করে নাbashডিফল্টরূপে এবং এম্বেড করা পরিবেশ যা আপনাকে কেবলমাত্র একটি সর্বনিম্ন শেল দেয় এবং busybox

উপসংহারে, যে মুহুর্তে আপনি নিজেকে এমন কোনও বৈশিষ্ট্য চেয়েছিলেন যা পোর্টেবল শেল ল্যাঙ্গুয়েজে উপলভ্য নয়, এটি একটি চিহ্ন যে স্ক্রিপ্টটি শেল স্ক্রিপ্টে থাকার জন্য খুব জটিল হয়ে উঠেছে। পরিবর্তে এটি আরও ভাল ভাষায় পুনর্লিখন করুন।


4
দুঃখিত তবে এটি কিছুটা মূর্খ। হ্যাঁ, আপনি যদি এমন কিছু লিখছেন যা i) বিতরণ করা হবে এবং ii) বিভিন্ন পরিবেশে, আপনার বেসিকটি আটকে থাকা উচিত sh। তবে এটি আপনার কাছে আর শাঁস ব্যবহার করা উচিত নয় ating এখানে প্রতিদিন হাজার হাজার (সম্ভবত আরও অনেকগুলি) স্ক্রিপ্ট লিখিত রয়েছে এবং সেগুলির সিংহভাগ কেবলমাত্র একটি মেশিনে চলবে। আপনার পরামর্শ উত্পাদন কোডটি বোঝায়, তবে বেশিরভাগ স্ক্রিপ্টগুলির জন্য রচিত দৈনিক "সিসডামিনি" কাজের জন্য নয়। যদি আমি জানি যে আমার স্ক্রিপ্টটি কেবলমাত্র আমার দ্বারা এবং একটি লিনাক্স মেশিনে ব্যবহার করা হবে তবে বাশ ভাল।
টেরডন

1
@ এটারডন কথাটি হ'ল যদি আপনার কাছে ব্যাশ স্ক্রিপ্ট লেখার বিকল্প থাকে তবে আপনার কাছে পার্ল (বা যাই হোক না কেন) স্ক্রিপ্ট লেখার বিকল্প রয়েছে এবং এটি সর্বদা ভাল পছন্দ।
zwol

@ ইটারডন উত্তরটি অবশ্যই মূর্খ নয়, এর পরিবর্তে আপনার মন্তব্যটি কেবল নির্বোধ। শেল স্ক্রিপ্টগুলি পার্ল এবং এর সাথে তুলনায় ডিবাগ করা ভয়ানক, যার জন্য গ্রাফিকাল ডিবাগিং এবং সমস্ত সহ সহজেই সম্পূর্ণ আইডিই ব্যবহার করা যায়। অতিরিক্তভাবে, কিছু ছোট স্ক্রিপ্টগুলির জন্য প্রতিদিন লিখিত বেশিরভাগ স্ক্রিপ্টগুলি আবার নতুন করে পরিবর্তিত হতে থাকে এবং বৃদ্ধি পায়, সহকর্মীদের বা নেট এর উদাহরণ হিসাবে অনুলিপি করা হয় etc. সম্ভবত এই ধরনের ঝুঁকি নেওয়ার কোনও কারণ নেই।
থারস্টেন শেনিং

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

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

4

সাধারণত যদি সময় কার্যকারিতার চেয়ে গুরুত্বপূর্ণ হয় তবে আপনি দ্রুত শেলটি ব্যবহার করবেন। sh প্রায়শই ড্যাশযুক্ত হয় এবং মূলের ক্রোন টাস্ক বা ব্যাচের ক্রিয়াকলাপের জন্য ব্যবহৃত হয় যেখানে প্রতিটি (ন্যানো) দ্বিতীয় গণনা করে।


2
ফাইল সিস্টেম থেকে অতিরিক্ত শেল ইন্টারপ্রেটার লোড করা এ জাতীয় সুবিধাটিকে তুচ্ছ করতে পারে এবং ন্যানোসেকেন্ডগুলি (যা প্রকৃত মেশিন চক্রের মতো আকারের একই ক্রমে থাকে) গণনা সি এবং অ্যাসেম্বলি ভাষা প্রোগ্রামারগুলির ডোমেন।
রেক্যান্ডবোনম্যান

ন্যানোসেকেন্ডগুলি ক্রোন জবগুলিতে কেবলমাত্র তার মধ্যে পার্থক্য তৈরি করে যদি আপনার মধ্যে কয়েকশো কোটি থাকে এবং ক্রোন যেভাবেই এতগুলি পরিচালনা করতে সক্ষম হবে না।
দিমিত্রি গ্রিগরিয়েভ

1
এমনকি ম্যাকেনজম কিছুটা বাড়িয়ে দেখালেও, বেশি পারফরম্যান্স করা ভাল বলে অস্বীকার করার কোনও দরকার নেই! "ন্যানো" অংশটি আটকাবেন না। (ন্যানোসেকেন্ডগুলি সি-তেও গণনা করে না যদি না এটি রিয়েল-টাইম সিস্টেমে বা এ জাতীয় অভ্যন্তরীণ লুপ হয়!)
jpaugh

1
@jpaugh আপনি যদি কোনও (লিগ্যাসি) সিস্টেমের সাথে কাজ না করেন তবে ধরে নেওয়া যায় যে নির্দিষ্ট ক্রিয়াকলাপগুলিতে কমপক্ষে একটি নির্দিষ্ট সময় লাগবে। এটা হয়!
জ্যাব

3

আরও সংক্ষিপ্ত হওয়ার জন্য, shবেশিরভাগ সিস্টেমে বহনযোগ্যতা সবচেয়ে গুরুত্বপূর্ণ এবং bashব্যাশের সংস্করণ যদি সমর্থন করে তবে আপনি এর নির্দিষ্ট বৈশিষ্ট্যগুলির যেমন অ্যারে ব্যবহার করতে চান তবে ব্যবহার করুন।


1
  • sh (বেশিরভাগ ক্ষেত্রে), বিশেষভাবে প্রয়োজনে বাশ (বা কেএসএস, বা যাই হোক না কেন)

সবচেয়ে নিরাপদ পথ। যখন হার্ড কোডিং থাকে তখন / ইউএসআর / বিন / হবে shellOfChoiceতবে আমি এখনই সর্বদা ব্যবহার করার চেষ্টা করছি - প্যাথএইচএইচ পরিবর্তনের মাধ্যমে 'ডিফল্ট লোকেশন' হিসাবে হতে পারে:

#! / usr / bin / env sh বা
#! / usr / bin / env বাশ
বা উদাহরণস্বরূপ, পার্ল স্ক্রিপ্টগুলি
#! / usr / bin / env perl -w

অবশ্যই, আপনার কাছে কখনই কোনও স্ক্রিপ্টের কারণ নেই যখন স্বয়ংক্রিয়ভাবে একটি নতুন পাঠাচ্ছেন, তারপরে এটি হার্ড-কোডেড থাকা চালিয়ে যান - এবং তারপরে / usr / বিন / কিছু সম্ভবত ব্যবহারের পথ হতে হবে।

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