যদি আমি লিখি,
#!/bin/bash
echo "foo"
অথবা
#!/bin/sh
echo "foo"
উভয় ফলন একই। আমি কিছু স্ক্রিপ্টগুলি দেখতে শুরু করেছি #!/bin/sh
বা দিয়ে #!/bin/bash
। তাদের মধ্যে কি কোনও পার্থক্য আছে?
যদি আমি লিখি,
#!/bin/bash
echo "foo"
অথবা
#!/bin/sh
echo "foo"
উভয় ফলন একই। আমি কিছু স্ক্রিপ্টগুলি দেখতে শুরু করেছি #!/bin/sh
বা দিয়ে #!/bin/bash
। তাদের মধ্যে কি কোনও পার্থক্য আছে?
উত্তর:
bash
এবং sh
দুটি পৃথক শাঁস হয়। মূলত bash
হয় sh
আরও বৈশিষ্ট্য এবং ভাল সিনট্যাক্স সঙ্গে। বেশিরভাগ কমান্ড একই কাজ করে তবে সেগুলি আলাদা।
এটি বলার পরে, /bin/sh
বেশিরভাগ সিস্টেমে আপনার উপলব্ধি হওয়া উচিত একটি প্রতীকী লিঙ্ক এবং অনুরোধ করবেন না sh
। উবুন্টুতে /bin/sh
লিঙ্ক ব্যবহার করত bash
, লিনাক্স বিতরণে সাধারণ আচরণ, তবে এখন ড্যাশ নামে অন্য শেলের সাথে সংযোগ স্থাপনে পরিবর্তন এসেছে । আমি এটি ব্যবহার করবো bash
, যেহেতু এটি বেশ মানক (বা আমার অভিজ্ঞতা থেকে কমপক্ষে সাধারণ)। প্রকৃতপক্ষে, যখন কোনও বাশ স্ক্রিপ্টটি ব্যবহার করবে তখন সমস্যা দেখা দেয় #!/bin/sh
কারণ স্ক্রিপ্ট-নির্মাতা ধরে নেন যে লিঙ্কটি bash
কখন তা করা উচিত নয়।
আরও তথ্যের জন্য, http://man.cx/sh , http://man.cx/bash ।
/bin/sh
1977 সালে বোর্ন শেল নামক একটি শেল হিসাবে ব্যবহৃত হত b ব্যাশ হ'ল একটি / বিন / শ সামঞ্জস্যপূর্ণ শেল যা পোর্সিক্স অনুসারে বোর্ন শেল রিপ্লেসমেন্ট হিসাবে ব্যবহার করা যেতে পারে। en.wikedia.org/wiki/Bourne_shell
লিনাক্স এবং অন্যান্য ইউনিক্স-মতো সিস্টেমে আপনার একাধিক শেল পছন্দ রয়েছে।
শেলটি কেবলমাত্র আপনার সামান্য প্রম্পট আঁকার জন্য নয়, আপনার আদেশগুলি ব্যাখ্যা করার জন্য দায়ী, বিশেষত যদি আপনি পাইপ, শর্তসাপেক্ষে জটিল জটিল যুক্তি রেখে থাকেন।
লিনাক্স সিস্টেমের ব্যবহারকারীদের জন্য ডিফল্ট শেল হিসাবে ব্যবহৃত ব্যাশ সবচেয়ে সাধারণ শেল। এটি ইউনিক্সের ইতিহাস জুড়ে ব্যবহৃত অন্যান্য শেলের আধ্যাত্মিক বংশধর। এর নাম, বাশ বোর্ন-অ্যাগেন শেলের সংক্ষিপ্ত রূপ, বোর্ন শেলটির প্রতিদান যা এটি প্রতিস্থাপনের জন্য ডিজাইন করা হয়েছিল, যদিও এটি সি শেল এবং কর্ন শেলের বৈশিষ্ট্যগুলিও অন্তর্ভুক্ত করে।
এটি চলছে, আজকাল থেকে /bin/bash
- ব্যাশ সহ যে কোনও সিস্টেমের এটি এখানে অ্যাক্সেসযোগ্য হবে।
যদিও এটি কেবল ব্যবহারকারীরা শেল ব্যবহার করে না। স্ক্রিপ্টগুলি ( শেল স্ক্রিপ্টগুলি ) তাদের ব্যাখ্যা করার জন্য শেলগুলির প্রয়োজন। আপনি যখন শেল স্ক্রিপ্টটি চালান, আপনার স্ক্রিপ্টটি কার্যকর করতে আপনার সিস্টেমে একটি শেল প্রক্রিয়া শুরু করা দরকার।
সমস্যাটি হ'ল, বিভিন্ন শেলের মধ্যে তাদের মধ্যে সামান্য সামান্য অসঙ্গতি থাকে এবং যখন স্ক্রিপ্টগুলি চালানোর কথা আসে তখন এগুলি একটি বাস্তব সমস্যা হতে পারে। ব্যাশে বেশ কিছু স্ক্রিপ্টিং বৈশিষ্ট্য রয়েছে যা কেবল বাশের জন্য অনন্য এবং অন্যান্য শেলের ক্ষেত্রে নয়। এটি ঠিক আছে, আপনি যদি সর্বদা এই স্ক্রিপ্টগুলি চালানোর জন্য ব্যাশ ব্যবহার করেন। অন্যান্য শেলগুলি হয় বাশকে অনুকরণ করার চেষ্টা করতে পারে, বা পসিক্স মানকে মেনে চলার চেষ্টা করতে পারে, যা ব্যাশটি বেশ ভাল সমর্থন করে (যদিও এর নিজস্ব এক্সটেনশানগুলি এতে যুক্ত করে)।
শেল স্ক্রিপ্টের শীর্ষে শিবির সাহায্যে কোন শেলটি চালানো উচিত তা নির্দিষ্ট করা সম্ভব। একটি স্ক্রিপ্ট #!/bin/bash
প্রথম লাইনে নির্দিষ্ট করতে পারে , যার অর্থ স্ক্রিপ্টটি সর্বদা অন্য শেলের পরিবর্তে ব্যাশ দিয়ে চালানো উচিত।
/ bin / sh সিস্টেম শেল প্রতিনিধিত্বকারী একটি এক্সিকিউটেবল । প্রকৃতপক্ষে, এটি সাধারণত শেল সিস্টেম শেল যেকোন শেলটির জন্য এক্সিকিউটেবলকে নির্দেশ করে একটি প্রতীকী লিঙ্ক হিসাবে প্রয়োগ করা হয়। সিস্টেম শেলটি এমন এক ধরণের ডিফল্ট শেল যা সিস্টেম স্ক্রিপ্ট ব্যবহার করা উচিত। লিনাক্স বিতরণগুলিতে, দীর্ঘ সময়ের জন্য এটি সাধারণত বাশের প্রতীকী লিঙ্ক ছিল , এত বেশি যে সর্বদা / বিন / শকে বাশ বা ব্যাশ-সামঞ্জস্যপূর্ণ শেলের সাথে সংযোগ স্থাপনের কিছুটা কনভেনশন হয়ে দাঁড়িয়েছে। যাইহোক, গত কয়েক বছর ধরে ডেবিয়ান (এবং উবুন্টু) সিস্টেম শেলটি বাশ থেকে ড্যাশে স্যুইচ করার সিদ্ধান্ত নিয়েছে- অনুরূপ শেল - লিনাক্সের দীর্ঘতর traditionতিহ্যের সাথে ভেঙে (ভাল, জিএনইউ) / বিন / শের জন্য ব্যাশ ব্যবহারের। ড্যাশকে হালকা এবং আরও দ্রুত শেল হিসাবে দেখা যায় যা বুট গতির পক্ষে উপকারী হতে পারে (এবং অন্যান্য জিনিসগুলির জন্য যেমন অনেকগুলি শেল স্ক্রিপ্ট যেমন প্যাকেজ ইনস্টলেশন স্ক্রিপ্টগুলির প্রয়োজন হয়)।
একই পোসিএক্স স্ট্যান্ডার্ডের ভিত্তিতে ড্যাশ ব্যাশের সাথে মোটামুটি উপযুক্ত। তবে এটি ব্যাশ-নির্দিষ্ট এক্সটেনশনগুলি কার্যকর করে না। অস্তিত্বের স্ক্রিপ্টগুলি রয়েছে যেগুলি #!/bin/sh
(সিস্টেম শেল) তাদের শেবাং হিসাবে ব্যবহার করে তবে বাশ-নির্দিষ্ট এক্সটেনশনগুলির প্রয়োজন। এটি বর্তমানে একটি ত্রুটি হিসাবে বিবেচিত হয় যা দেবিয়ান এবং উবুন্টু দ্বারা স্থির করা উচিত , যাকে ড্যাশের দিকে নির্দেশ করার সময় / বিন / এসএস কাজ করতে সক্ষম হয়।
যদিও উবুন্টুর সিস্টেম শেলটি ড্যাশের দিকে ইঙ্গিত করছে, একজন ব্যবহারকারী হিসাবে আপনার লগইন শেলটি এই মুহুর্তে বশ হতে চলেছে। অর্থাৎ, আপনি যখন লিনাক্সের যে কোনও জায়গায় টার্মিনাল এমুলেটরটিতে লগ ইন করবেন তখন আপনার লগইন শেলটি বাশ হবে। শেলটি ইন্টারেক্টিভভাবে ব্যবহৃত হয় এবং অপারেশনের গতি তেমন সমস্যা হয় না এবং ব্যবহারকারীরা ব্যাশের সাথে পরিচিত হন (এবং তাদের হোম ডিরেক্টরিতে ব্যাশ-নির্দিষ্ট কাস্টমাইজেশন থাকতে পারে)।
স্ক্রিপ্ট লেখার সময় আপনার কী ব্যবহার করা উচিত
যদি আপনার স্ক্রিপ্টে কেবল বাশ দ্বারা সমর্থিত বৈশিষ্ট্যগুলি প্রয়োজন হয় তবে ব্যবহার করুন #!/bin/bash
।
তবে যদি সম্ভব হয় তবে আপনার স্ক্রিপ্টটি পসিক্স-সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করা ভাল এবং ব্যবহার #!/bin/sh
, যা সর্বদা, বেশ নির্ভরযোগ্যভাবে, কোনও ইনস্টলেশনে পছন্দসই পসিক্স-সামঞ্জস্যপূর্ণ সিস্টেম শেলটি নির্দেশ করে।
পূর্ববর্তী উত্তরগুলি ছাড়াও, যদিও /bin/sh
এটি একটি প্রতীকী লিঙ্ক /bin/bash
, #!/bin/sh
সম্পূর্ণরূপে সমতুল্য নয় #!/bin/bash
।
থেকে ব্যাশ (1) man পৃষ্ঠা :
"যদি শ নামের সাথে বাশকে আহ্বান করা হয় তবে এটি পসিক্স স্ট্যান্ডার্ডের সাথে সামঞ্জস্য রেখে যতটা সম্ভব নিবিড়ভাবে ofতিহাসিক সংস্করণের শুরুর আচরণটি নকল করার চেষ্টা করে।"
উদাহরণস্বরূপ বাশ নির্দিষ্ট সিনট্যাক্স:
exec > >(tee logfile.txt)
#!/bin/sh
এমনকি শ-> ব্যাশ প্রতীকী লিঙ্কটি স্থানে রেখে শেলের শুরুতে একটি ত্রুটি দেয় ।
গনুহ ব্যাশ: #!/bin/bash
; POSIX শেল: #!/bin/sh
।