আপনি এটি পিছনে পেয়েছেন। /bin/sh
আজকাল প্রায় কোনও বোর্ন শেল নয়, এবং এটি যখন when যখন আপনি শে #! /bin/sh
-ব্যাং ব্যবহার করেন তখন আপনার কোনও সমস্যা হয় ।
বোর্ন শেলটি 70 এর দশকের শেষের দিকে লেখা একটি শেল এবং পূর্ববর্তী থম্পসন শেলটি (এটিও বলা হয় sh
) প্রতিস্থাপন করে । ৮০ এর দশকের গোড়ার দিকে, ডেভিড কর্ন বোর্ন শেলটির জন্য কয়েকটি এক্সটেনশন লিখেছিলেন, কয়েকটি বাগ এবং নকশা বিশিষ্টতা নির্ধারণ করেছিলেন (এবং কিছুটি প্রবর্তন করেছিলেন) এবং এটিকে কর্ন শেল বলেছিলেন।
নব্বইয়ের দশকের গোড়ার দিকে, পসিক্স কর্ন শেলের একটি সাবসেটের উপর ভিত্তি করে sh
ভাষাটি নির্দিষ্ট করে এবং বেশিরভাগ সিস্টেমগুলি এখন তাদের পরিবর্তন /bin/sh
করে কর্ন শেল বা একটি শেলকে সেই স্পেসিফিকেশনের সাথে সামঞ্জস্য করে। বিএসডি-র ক্ষেত্রে, তারা ধীরে ধীরে তাদের পরিবর্তন করে /bin/sh
, প্রাথমিকভাবে (লাইসেন্সের কারণে তারা আর বাউর্ন শেল ব্যবহার করতে না পারার পরে) অ্যালকুইস্ট শেল, কিছু ksh এক্সটেনশন সহ বোর্ন শেলটির একটি ক্লোন তাই এটি পসিক্স অনুগত হয়।
বর্তমানে, সমস্ত পসিক্স সিস্টেমে একটি শেল রয়েছে sh
(প্রায়শই প্রায়শই, তবে অগত্যা নয় /bin
, পসিক্স তার দ্বারা নির্দিষ্ট করা ইউটিলিটিগুলির পাথ নির্দিষ্ট করে না) যা বেশিরভাগই পসিক্স অনুগত। এটি সাধারণত ksh88, ksh93, pdksh, বাশ, অ্যাশ বা zsh² এর উপর ভিত্তি করে তৈরি হয় তবে বোর্ন শেলটি পসিক্সের সাথে সামঞ্জস্যপূর্ণ কখনও হয় নি ³ সেই শেল মধ্যে কয়েকজন ( bash
, zsh
, yash
এবং কিছু pdksh
ডেরাইভেটিভস একটি POSIX-অনুবর্তী মোড হিসাবে প্রার্থনা সক্ষম sh
এবং হয় কম অন্যথায় অনুবর্তী)।
bash
(কর্ন শেলের জেএনইউ উত্তর) আসলে একমাত্র ওপেন সোর্স শেল (এবং একজন বলতে পারে যে কেবল বর্তমানে রক্ষণাবেক্ষণ করা হয়েছে অন্যগুলি সাধারণত ksh88 এর উপর নির্ভরশীল যা 90 এর দশকের পর থেকে কোনও নতুন বৈশিষ্ট্য অর্জন করেনি) যা প্রত্যয়ন করা হয়েছে পসিক্স অনুগত sh
(ম্যাকোস শংসাপত্রের অংশ হিসাবে)
যখন আপনি কোনও শি #! /bin/sh -
-ব্যাং দিয়ে কোনও স্ক্রিপ্ট লেখেন , আপনার একটি স্ট্যান্ডার্ড sh
সিনট্যাক্স ব্যবহার করা উচিত (এবং আপনি যদি পোর্টেবল হতে চান তবে সেই স্ক্রিপ্টটিতে ব্যবহৃত ইউটিলিটিগুলির জন্য স্ট্যান্ডার্ড সিনট্যাক্সও ব্যবহার করা উচিত, এটি কেবল শেল নয় যা শেলের ব্যাখ্যার সময় জড়িত থাকে স্ক্রিপ্ট), তারপরে এটি মানক sh
সিনট্যাক্স ইন্টারপ্রেটার ব্যবহার ( ksh
, bash
...) ব্যবহার করে কি তা বিবেচনা করে না ।
আপনি যতক্ষণ না সেগুলি ব্যবহার না করেন ততক্ষণ এই শেলগুলির স্ট্যান্ডার্ডের উপরে এক্সটেনশন রয়েছে তা বিবেচ্য নয়। এটি সি কোড লেখার মতো, আপনি যতক্ষণ না স্ট্যান্ডার্ড সি কোড লেখেন এবং একটি সংকলক (যেমন gcc
) বা অন্যটির এক্সটেনশন ব্যবহার করবেন না , আপনার কোডটি সংকলক বাস্তবায়নের ক্ষেত্রে নির্বিশেষে সংশোধন করুন যে সংকলকটি উপযুক্ত is
এখানে, আপনার সঙ্গে #! /bin/sh
সে bang, আপনার প্রধান সমস্যা ব্যবস্থা যেখানে হবে /bin/sh
বোর্ন শেল যে দৃষ্টান্ত মত মান বৈশিষ্ট্য সমর্থন করে না জন্য $((1+1))
, $(cmd)
, ${var#pattern}
... ইন যে ক্ষেত্রে তোমার মত-এরাউন্ড প্রয়োজন হতে পারে:
#! /bin/sh -
if false ^ true; then
# in the Bourne shell, ^ is an alias for |, so false ^ true returns
# true in the Bourne shell and the Bourne shell only.
# Assume the system is Solaris 10 (older versions are no longer maintained)
# You would need to adapt if you need to support some other system
# where /bin/sh is the Bourne shell.
# We also need to fix $PATH as the other utilities in /bin are
# also ancient and not POSIX compatible.
PATH=`/usr/xpg6/bin/getconf PATH`${PATH:+:}$PATH || exit
export PATH
exec /usr/xpg4/bin/sh "$0" "$@"
# that should give us an environment that is mostly compliant
# to the Single UNIX Specification version 3 (POSIX.2004), the
# latest supported by Solaris 10.
fi
# rest of the script
উপায় দ্বারা, উবুন্টু এর /bin/sh
নয় bash
ডিফল্টরূপে। এটি dash
আজকাল নেটবডিএসডি ভিত্তিতে তৈরি একটি শেল sh
, নিজেই অ্যালকুইস্ট শেলের উপর ভিত্তি করে যা বেশিরভাগ পসিক্স অনুগত হয় ব্যতীত এটি মাল্টি-বাইট অক্ষরকে সমর্থন করে না। উবুন্টু এবং অন্যান্য ডেবিয়ান ভিত্তিক সিস্টেমে, আপনার মধ্যে নির্বাচন করতে পারবেন bash
এবং dash
এর জন্য /bin/sh
সঙ্গে dpkg-reconfigure dash
) 4 । sh
দেবিয়ান সহ প্রেরিত স্ক্রিপ্টগুলি উভয় শেলের মধ্যে একইভাবে কাজ করা উচিত কারণ সেগুলি দেবিয়ান নীতি মান (পসিক্স স্ট্যান্ডার্ডের একটি সুপারসেট) তে লেখা হয়। আপনি সম্ভবত তারাও খুঁজে পাবেন কাজ ঠিক আছে zsh
'র sh
এমুলেশন বা bosh
(সম্ভবত না ksh93
কিংবা yash
যা না local
builtin (ডেবিয়ান নীতি কিন্তু POSIX) দ্বারা প্রয়োজনীয়)।
Unix.stackexchange.com- তে থাকা সমস্ত সিস্টেমে sh
কোথাও একটি পসিক্স রয়েছে । তাদের বেশিরভাগের একটি রয়েছে /bin/sh
(আপনার কাছে সম্ভবত খুব বিরল বিষয় রয়েছে যাগুলির একটি /bin
ডিরেক্টরি নেই তবে সম্ভবত আপনি এটি সম্পর্কে যত্নশীল নন), এবং এটি সাধারণত পসিক্স sh
ইন্টারপ্রেটার (এবং বিরল ক্ষেত্রে এটির (অ-মানক) পরিবর্তে বোর্ন শেল রয়েছে instead )।
তবে sh
একমাত্র শেল ইন্টারপ্রেটার এক্সিকিউটেবল আপনি কোনও সিস্টেমে এটি সন্ধানের বিষয়ে নিশ্চিত হতে পারেন। অন্যান্য শেলগুলির জন্য, আপনি নিশ্চিত হতে পারেন যে ম্যাকোস, সাইগউইন এবং বেশিরভাগ জিএনইউ / লিনাক্স বিতরণ থাকবে bash
। এসওয়াইএসভি-উত্পাদিত ওএসস (সোলারিস, এআইএক্স ...) সাধারণত ksh88 থাকবে, সম্ভবত ksh93। ওপেনবিএসডি, মিরোসের একটি পিডিক্স ডেরিভেটিভ থাকবে। ম্যাকোস থাকবে zsh
। তবে এর বাইরে কোনও গ্যারান্টি থাকবে না। অন্য কোনও bash
শেল /bin
বা অন্য কোথাও ইনস্টল করা হবে কিনা সে সম্পর্কে কোনও গ্যারান্টি নেই ( /usr/local/bin
উদাহরণস্বরূপ এটি ইনস্টল করার পরে এটি BSDs এ সাধারণত পাওয়া যায় )। এবং অবশ্যই ইনস্টল করা হবে যে শেল এর সংস্করণ কোন গ্যারান্টি।
নোট করুন যে এটি #! /path/to/executable
কোনও কনভেনশন নয় , এটি সমস্ত ইউনিক্সের মতো কার্নেলের বৈশিষ্ট্য ( ডেনিস রিচি দ্বারা 80 এর দশকের গোড়ার দিকে প্রবর্তিত ) যা প্রথম লাইনে দোভাষীর পথ নির্দিষ্ট করে স্বেচ্ছাচারিত ফাইলগুলি সম্পাদন করতে দেয় #!
। এটি যে কোনও কার্যকর হতে পারে।
আপনি যখন কোনও ফাইল চালনা করেন যার প্রথম লাইনটি শুরু হয় #! /some/file some-optional-arg
, কার্নেলটি সম্পাদন শেষ /some/file
হয় some-optional-arg
, স্ক্রিপ্টের পথ এবং মূল আর্গুমেন্টগুলি আর্গুমেন্ট হিসাবে। #! /bin/echo test
কী হচ্ছে তা দেখার জন্য আপনি প্রথম লাইনটি তৈরি করতে পারেন:
$ ./myscript foo
test ./myscript foo
আপনি /bin/sh -
পরিবর্তে ব্যবহার করার সময় /bin/echo test
, কার্নেল সঞ্চালিত হয় /bin/sh - ./myscript foo
, sh
সঞ্চিত সামগ্রী কোডটিকে ব্যাখ্যা করে myscript
এবং সেই প্রথম লাইনে এটি একটি মন্তব্য হিসাবে (উপস্থাপিত হয় #
) উপেক্ষা করে ।
Today সম্ভবত একমাত্র সিস্টেম আজ যেখানে আমাদের মধ্যে /bin/sh
যে কেউ বোর্ন শেলের উপর ভিত্তি করে একটি সোলারিস 10 ভিত্তিতে আসে সেগুলি সোলারিস হ'ল পশ্চাতে সামঞ্জস্যের জন্য বোর্ন শেলকে সেখানে রাখার সিদ্ধান্ত নিয়েছে এমন কয়েকটি ইউনিকের মধ্যে একটি সোলারিস (পসিক্স sh
ভাষা সম্পূর্ণরূপে নয়) বর্ন শেলটির সাথে পিছনে সামঞ্জস্যপূর্ণ) এবং (কমপক্ষে ডেস্কটপ এবং সম্পূর্ণ সার্ভার মোতায়েনের জন্য) sh
অন্য কোথাও /usr/xpg4/bin/sh
পসিক্স রয়েছে (ইন , ksh88 এর উপর ভিত্তি করে) তবে সোলারিস ১১ এ পরিবর্তিত হয়েছে যেখানে /bin/sh
এখন ksh93 রয়েছে। অন্যগুলি বেশিরভাগই নিখোঁজ।
² এর MacOS এর / X হতে ব্যবহৃত , কিন্তু পরে পরিবর্তিত । এটি পসিক্স বাস্তবায়ন হিসাবে ব্যবহৃত প্রাথমিক ফোকাস নয় । এর মোডটি প্রাথমিকভাবে স্ক্রিপ্টগুলিতে এম্বেড বা ( ) পসিক্স কোড কল করতে সক্ষম হয়/bin/sh
zsh
bash
zsh
sh
sh
source
sh
zsh
³ সম্প্রতি, @ শচলি ওপেনসোলারিস শেলটি ( বোভেন শেলের উপর ভিত্তি করে এসভিআর 4 শেলের উপর ভিত্তি করে) POSIX এর অনুগত হয়ে উঠেছে, বলা হয়েছে bosh
তবে আমি এখনও অবগত নই যে এটি কোনও সিস্টেমে ব্যবহৃত হয়েছে। সেই সাথে ksh88
বোর্ন শেলের কোডের উপর ভিত্তি করে এটি একটি দ্বিতীয় পসিক্স-কমপ্লায়েন্ট শেল করে
4 পুরানো সংস্করণগুলিতে, আপনি এটি ব্যবহার করতে পারেন mksh
বা এর আরও পসিক্স lksh
অবতারও। এটি মিরস (পূর্বে মিরবিএসডি) পিডিএক্সেশের উপর ভিত্তি করে শেল, নিজেই ফোর্সথ শেলের উপর ভিত্তি করে (বোর্ন শেলের আরেকটি পুনর্নির্মাণ)