#! / বিন / শ এবং #! / বিন / বাশের মধ্যে পার্থক্য কী?


280

যদি আমি লিখি,

#!/bin/bash
echo "foo"

অথবা

#!/bin/sh
echo "foo"

উভয় ফলন একই। আমি কিছু স্ক্রিপ্টগুলি দেখতে শুরু করেছি #!/bin/shবা দিয়ে #!/bin/bash। তাদের মধ্যে কি কোনও পার্থক্য আছে?

উত্তর:


242

bashএবং shদুটি পৃথক শাঁস হয়। মূলত bashহয় shআরও বৈশিষ্ট্য এবং ভাল সিনট্যাক্স সঙ্গে। বেশিরভাগ কমান্ড একই কাজ করে তবে সেগুলি আলাদা।

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

আরও তথ্যের জন্য, http://man.cx/sh , http://man.cx/bash


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

18
/bin/sh1977 সালে বোর্ন শেল নামক একটি শেল হিসাবে ব্যবহৃত হত b ব্যাশ হ'ল একটি / বিন / শ সামঞ্জস্যপূর্ণ শেল যা পোর্সিক্স অনুসারে বোর্ন শেল রিপ্লেসমেন্ট হিসাবে ব্যবহার করা যেতে পারে। en.wikedia.org/wiki/Bourne_shell
অ্যালেক্স

5
বাশ একটি ডি ফ্যাক্টো স্ট্যান্ডার্ড (খুব ব্যাপকভাবে ব্যবহৃত) তবে এটি "স্ট্যান্ডার্ড" নয়; SH উবুন্টু তে ব্যবহার ড্যাশ , যা একটি Posix-অনুবর্তী শেল, তাই এটি সত্যিই মান। আমার পরামর্শ হ'ল স্ক্রিপ্টিংয়ের জন্য বিশেষত সার্ভার-সাইড স্ক্রিপ্টগুলির জন্য ড্যাশ ব্যবহার করা । যদিও বাশ আরও অভিব্যক্তিপূর্ণ, ড্যাশগুলি বেশ দ্রুত গতিতে চলে এবং আরও সুরক্ষিত।
রিক -777

@ রিক-777 So তাই আমি কি আমার স্ক্রিপ্টগুলির শীর্ষে স্পষ্টভাবে #! / বিন / ড্যাশ যুক্ত করব? আমি স্ক্রিপ্টগুলিও লিখেছি যেখানে আমি কেবল কমান্ড লিখি এবং ./scriptName দিয়ে কার্যকর করি এবং এটি দুর্দান্ত কাজ করেছে। #! / বিন / আপনার শেল এখানে কি প্রয়োজনীয়?
ব্যবহারকারী 137717

@ রিক-7777 যে ক্ষেত্রে আমি কোনও #! / Bin / শেলনাম বাদ দিই না কেন, আমি ফাইলের নাম ফাইলনাম.শ রেখেছি। এটি #! / বিন / শ ঘোষণা না করেই কি প্রচ্ছন্নভাবে পছন্দসই সিস্টেম শেলের সাথে লিঙ্ক করবে?
ব্যবহারকারী 137717

82

লিনাক্স এবং অন্যান্য ইউনিক্স-মতো সিস্টেমে আপনার একাধিক শেল পছন্দ রয়েছে।

শেলটি কেবলমাত্র আপনার সামান্য প্রম্পট আঁকার জন্য নয়, আপনার আদেশগুলি ব্যাখ্যা করার জন্য দায়ী, বিশেষত যদি আপনি পাইপ, শর্তসাপেক্ষে জটিল জটিল যুক্তি রেখে থাকেন।

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

এটি চলছে, আজকাল থেকে /bin/bash- ব্যাশ সহ যে কোনও সিস্টেমের এটি এখানে অ্যাক্সেসযোগ্য হবে।

যদিও এটি কেবল ব্যবহারকারীরা শেল ব্যবহার করে না। স্ক্রিপ্টগুলি ( শেল স্ক্রিপ্টগুলি ) তাদের ব্যাখ্যা করার জন্য শেলগুলির প্রয়োজন। আপনি যখন শেল স্ক্রিপ্টটি চালান, আপনার স্ক্রিপ্টটি কার্যকর করতে আপনার সিস্টেমে একটি শেল প্রক্রিয়া শুরু করা দরকার।

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

শেল স্ক্রিপ্টের শীর্ষে শিবির সাহায্যে কোন শেলটি চালানো উচিত তা নির্দিষ্ট করা সম্ভব। একটি স্ক্রিপ্ট #!/bin/bashপ্রথম লাইনে নির্দিষ্ট করতে পারে , যার অর্থ স্ক্রিপ্টটি সর্বদা অন্য শেলের পরিবর্তে ব্যাশ দিয়ে চালানো উচিত।

/ bin / sh সিস্টেম শেল প্রতিনিধিত্বকারী একটি এক্সিকিউটেবল । প্রকৃতপক্ষে, এটি সাধারণত শেল সিস্টেম শেল যেকোন শেলটির জন্য এক্সিকিউটেবলকে নির্দেশ করে একটি প্রতীকী লিঙ্ক হিসাবে প্রয়োগ করা হয়। সিস্টেম শেলটি এমন এক ধরণের ডিফল্ট শেল যা সিস্টেম স্ক্রিপ্ট ব্যবহার করা উচিত। লিনাক্স বিতরণগুলিতে, দীর্ঘ সময়ের জন্য এটি সাধারণত বাশের প্রতীকী লিঙ্ক ছিল , এত বেশি যে সর্বদা / বিন / শকে বাশ বা ব্যাশ-সামঞ্জস্যপূর্ণ শেলের সাথে সংযোগ স্থাপনের কিছুটা কনভেনশন হয়ে দাঁড়িয়েছে। যাইহোক, গত কয়েক বছর ধরে ডেবিয়ান (এবং উবুন্টু) সিস্টেম শেলটি বাশ থেকে ড্যাশে স্যুইচ করার সিদ্ধান্ত নিয়েছে- অনুরূপ শেল - লিনাক্সের দীর্ঘতর traditionতিহ্যের সাথে ভেঙে (ভাল, জিএনইউ) / বিন / শের জন্য ব্যাশ ব্যবহারের। ড্যাশকে হালকা এবং আরও দ্রুত শেল হিসাবে দেখা যায় যা বুট গতির পক্ষে উপকারী হতে পারে (এবং অন্যান্য জিনিসগুলির জন্য যেমন অনেকগুলি শেল স্ক্রিপ্ট যেমন প্যাকেজ ইনস্টলেশন স্ক্রিপ্টগুলির প্রয়োজন হয়)।

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

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

স্ক্রিপ্ট লেখার সময় আপনার কী ব্যবহার করা উচিত

যদি আপনার স্ক্রিপ্টে কেবল বাশ দ্বারা সমর্থিত বৈশিষ্ট্যগুলি প্রয়োজন হয় তবে ব্যবহার করুন #!/bin/bash

তবে যদি সম্ভব হয় তবে আপনার স্ক্রিপ্টটি পসিক্স-সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করা ভাল এবং ব্যবহার #!/bin/sh, যা সর্বদা, বেশ নির্ভরযোগ্যভাবে, কোনও ইনস্টলেশনে পছন্দসই পসিক্স-সামঞ্জস্যপূর্ণ সিস্টেম শেলটি নির্দেশ করে।


18

পূর্ববর্তী উত্তরগুলি ছাড়াও, যদিও /bin/shএটি একটি প্রতীকী লিঙ্ক /bin/bash, #!/bin/shসম্পূর্ণরূপে সমতুল্য নয় #!/bin/bash

থেকে ব্যাশ (1) man পৃষ্ঠা :

"যদি শ নামের সাথে বাশকে আহ্বান করা হয় তবে এটি পসিক্স স্ট্যান্ডার্ডের সাথে সামঞ্জস্য রেখে যতটা সম্ভব নিবিড়ভাবে ofতিহাসিক সংস্করণের শুরুর আচরণটি নকল করার চেষ্টা করে।"

উদাহরণস্বরূপ বাশ নির্দিষ্ট সিনট্যাক্স:

 exec  > >(tee logfile.txt)

#!/bin/shএমনকি শ-> ব্যাশ প্রতীকী লিঙ্কটি স্থানে রেখে শেলের শুরুতে একটি ত্রুটি দেয় ।


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