শ এবং ব্যাশের ক্ষেত্রে কেন আমি আলাদা আউটপুট পাই?


8

আমার কাছে নিম্নলিখিত সরল স্ক্রিপ্ট রয়েছে:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {1..99..2}
do
        echo $i
done

যদি আমি সাথে চালিত আউটপুট sh file.sh:

Bash version ...
{1..99..2}

যদি আমি সাথে চালিত আউটপুট bash file.sh:

Bash version 4.2.25(1)-release...
1
3
5
.
.
.
99

আমার দুটি প্রশ্ন আছে:

  1. আমি একটি shabang লাইন শেল উল্লেখ লিখেছি, এটা ব্যাশ না চালানো উচিত আমি ব্যবহার কিনা sh file.shবা bash file.sh?

  2. আমি বুঝতে পারছি যে $BASH_VERSIONশি দ্বারা স্বীকৃত নয় তবে লুপের জন্য সমস্যা কী? নম্বর ছাপছে না কেন?

উত্তর:


16

sh, বোর্ন শেলটি পুরানো । এর আচরণটি পসিক্স মান দ্বারা নির্দিষ্ট করা হয়েছে । আপনি যদি নতুন আচরণ চান, আপনি ব্যবহার করুন bash, বোর্ন অ্যাগেইন শেল, যা এতে সর্বদা নতুন বৈশিষ্ট্য যুক্ত হয়। অনেক সিস্টেমে, ন্যায়বিচারী shহয় bashএবং bashসেই নামে চালিত হলে একটি সামঞ্জস্যতা মোড চালু করে। উবুন্টু তারিখে shহয় dash, ডেবিয়ান Almquist শেল।

ধনুর্বন্ধনী প্রসারণ তুলনামূলকভাবে নতুন বৈশিষ্ট্য , এবং পুরানো বাশগুলিতেও এটি উপলভ্য হবে না। এটি অবশ্যই হওয়া উচিত নয় sh

আপনি যদি স্ক্রিপ্টটিকে একটি এক্সিকিউটেবল হিসাবে কল করেন তবে শেবাং লাইনটি সম্মানিত হবে:

./myscript.sh

আমি কোনও শিবাং কোনও স্ক্রিপ্ট দিতে পারি এবং তা চালিয়ে পাইথনে এটি খুলতে পারি:

python myscript.sh

ইউনিক্স এবং লিনাক্সে এই দুর্দান্ত প্রশ্নগুলি দেখুন:


5

এসএইচ বোকা। এটা কিছুই করতে পারে না।

এটি কেবল সর্বাধিক প্রাথমিক আদেশগুলি জানে। এটি অন্য কিছু করে না।

এটি একটি সংখ্যাগত মান হিসাবে {1..99} বুঝতে পারে না। এটি এটিকে স্ট্রিং হিসাবে বোঝে।

এসএইচ / ড্যাশ উন্নত নয়। এটি ডিআইআরআই পরিস্থিতিতে একটি জরুরী প্রম্পট হিসাবে বোঝানো হয়েছে (ইন্টারেক্টিভ মোডে Otherwise অন্যথায়, স্ক্রিপ্টিংয়ের জন্য এটি সত্যিই ভাল জিনিস))।

বাশকে সুপারিশ করা হয় যেহেতু এটি এসএইচ করতে পারে সবকিছু করতে পারে, পাশাপাশি কাস্টমাইজেশন এবং শক্তিশালী বৈশিষ্ট্যগুলির ক্ষেত্রেও নতুন।

# 1 এর উত্তরে, #!প্রোগ্রামটি সরাসরি কল করা হলে কেবল পার্স করা যায়। (যেমন হিসাবে, ./program.sh)


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

এলিয়াকাগান @ আপনি যদি সত্যিই কেবল এসএইচ ব্যবহার করেন তবে মারাত্মক ভুল হলে কিছু হয়।
কাজ ওল্ফ

1
আপনি shবেশ নিয়মিত এবং বিশেষত নিবিড়ভাবে উবুন্টু বুট হিসাবে ব্যবহার করেন । এটি স্বয়ংক্রিয় স্ক্রিপ্টিং ব্যবহারের জন্য এটি মূলত গুরুত্বপূর্ণ এবং এটি উবুন্টুতে একটি গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে। (আপনি হলে অপসারণ/bin/sh : উবুন্টু একটি ব্যবহারযোগ্য দশায় বুট আপ করতে পারেনি সিমবলিক লিঙ্ক - - যাতে, প্রভাব, সেখানে "কোন শুট আউট" হবে কিছু ভয়ঙ্কর ভুল যেতে হবে।)
Eliah মধ্যে Kagan

@ এলিয়াকাগান আপনি সর্বশেষ কখন আপনার পছন্দসই টার্মিনাল হিসাবে এসএইচ ব্যবহার করেছিলেন? আমি জানি আপনি এটি স্ক্রিপ্টে ব্যবহার করেন তবে আপনি কখন এটি ইন্টারেক্টিভ মোডে ব্যবহার করবেন?
কাজ ওল্ফ

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