বোর্ন শেল যদি কোনও বিতরণে না পাওয়া যায় তবে হ্যাশবাংয়ে / বিন / শ ব্যবহার করা কি সঠিক?


15

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

আমার প্রশ্ন যে পয়েন্ট শুরু হয়। এখন পর্যন্ত আমি এই মন্তব্য মত দেখেনি #!/bin/bash। এটা সর্বদা হয় #!/bin/sh। তবে উবুন্টু বিতরণে বোর্ন শেল প্রোগ্রাম নেই। তাদের বোর্ন অ্যাগেইন শেল (বাশ) রয়েছে।

সেই বিন্দুতে, #!/bin/shউবুন্টু বিতরণগুলিতে লিখিত শেল স্ক্রিপ্টগুলিতে মন্তব্য করা কি সঠিক ?


4
একেএ
শেবাং

1
এই সার্ভারফল্ট প্রশ্নের আমার উত্তর দেখুন: সর্বাধিক পোর্টেবিলিটির জন্য #! / বিন / শ বনাম #! / বিন / বাশ
গর্ডন ডেভিসন

আরও সাধারণভাবে বলা হয়shebang
এফএমপুরফি

উত্তর:


16

#!/bin/shসমস্ত ইউনিক্স এবং ইউনিক্সের মতো বিতরণে কাজ করা উচিত। আপনার স্ক্রিপ্টটি পসিক্স অনুগত হয় যতক্ষণ না এটি সাধারণত সবচেয়ে বহনযোগ্য হ্যাশবাং হিসাবে বিবেচিত হয়। /bin/shশেল শেল যে কার্যকরী POSIX শেল মান, কি প্রকৃত শেল হিসাবে ছদ্মবেশ হয় নির্বিশেষে হতে অনুমিত হয় /bin/shশেল।


#!/bin/shবোর্ন শেলটি আর রক্ষণাবেক্ষণ না হওয়ায় সাধারণত এখন কেবল একটি লিঙ্ক। অনেক ইউনিক্স সিস্টেমে /bin/shলিঙ্ক হবে /bin/kshবা /bin/ashঅনেকগুলি এইচএইচইএল ভিত্তিক লিনাক্স সিস্টেমের সাথে এটি লিঙ্ক হবে /bin/bash, তবে উবুন্টু এবং অনেকগুলি ডেবিয়ান ভিত্তিক সিস্টেমে এটির একটি লিঙ্ক /bin/dash। সমস্ত শাঁস, যখন হিসাবে আহ্বান করা shহবে , তখন পসআইএক্স সামঞ্জস্যতা মোডে প্রবেশ করবে।

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

দ্রষ্টব্য: যখন bashপসিক্স মোডে ডাকা হয় তখনও এটি কিছু নন-পসিক্স জিনিস যেমন [[অ্যারে এবং আরও অনেক কিছুতে অনুমতি দেয়। এই জিনিসগুলি একটি অ- bashসিস্টেমে ব্যর্থ হতে পারে ।


3
"উবুন্টুতে এটি / বিন / ড্যাশের একটি লিঙ্ক" এবং সাধারণভাবে অন্যান্য ডেবিয়ান-ভিত্তিক সিস্টেম রয়েছে। ফ্রিবিএসডি / ঘোস্টবিএসডি-তে আইআইআরসি এটিও একটি সিমিলিংক /bin/ash
সের্গেই কোলোডিয়াজনি

পুরোপুরি পোর্টেবল হওয়ার জন্য, শেবাং এবং (পরম) দোভাষীর পাথের মধ্যে একটি স্থান রাখুন। কিছু সিস্টেম ন্যায়বিচারের #! /পরিবর্তে সন্ধান করে #!
সাইমন রিখটার

5
@ সিমনরিখটার এর জন্য একটি রেফারেন্স দেখতে ভাল লাগবে।
কুসালানন্দ

@ সার্জিকিলোডিএজনি ফ্রিবিএসডি-তে sh এর ইনস্টলড সংস্করণটি ছাই এবং একটি সিমিলিংক নয়।
রব

2
@ কুসালানন্দ, হুম, এই পৃষ্ঠাটি বলছে যে এটি একটি পৌরাণিক কাহিনী, তাই সম্ভবত এটি উপেক্ষা করা যেতে পারে।
সাইমন রিখটার

12

আপনি এটি পিছনে পেয়েছেন। /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) 4shদেবিয়ান সহ প্রেরিত স্ক্রিপ্টগুলি উভয় শেলের মধ্যে একইভাবে কাজ করা উচিত কারণ সেগুলি দেবিয়ান নীতি মান (পসিক্স স্ট্যান্ডার্ডের একটি সুপারসেট) তে লেখা হয়। আপনি সম্ভবত তারাও খুঁজে পাবেন কাজ ঠিক আছে zsh'র shএমুলেশন বা bosh(সম্ভবত না ksh93কিংবা yashযা না localbuiltin (ডেবিয়ান নীতি কিন্তু 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/shzshbashzshshshsourceshzsh

³ সম্প্রতি, @ শচলি ওপেনসোলারিস শেলটি ( বোভেন শেলের উপর ভিত্তি করে এসভিআর 4 শেলের উপর ভিত্তি করে) POSIX এর অনুগত হয়ে উঠেছে, বলা হয়েছে boshতবে আমি এখনও অবগত নই যে এটি কোনও সিস্টেমে ব্যবহৃত হয়েছে। সেই সাথে ksh88বোর্ন শেলের কোডের উপর ভিত্তি করে এটি একটি দ্বিতীয় পসিক্স-কমপ্লায়েন্ট শেল করে

4 পুরানো সংস্করণগুলিতে, আপনি এটি ব্যবহার করতে পারেন mkshবা এর আরও পসিক্স lkshঅবতারও। এটি মিরস (পূর্বে মিরবিএসডি) পিডিএক্সেশের উপর ভিত্তি করে শেল, নিজেই ফোর্সথ শেলের উপর ভিত্তি করে (বোর্ন শেলের আরেকটি পুনর্নির্মাণ)


মাইনর জিনিস (শেল কোড মিড-উত্তর সম্পর্কে): আপনার ঠিক exec sh "$0" "$@"সেটআপ করার পরে ব্যবহার করা উচিত নয় PATH? shএটি সঠিক জায়গা থেকে নেওয়া উচিত , আমি ভেবেছিলাম।
কুসালানন্দ

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

ওএসএক্সের কোনও পোস্টিটি পসিক্স শেল হিসাবে ksh ব্যবহার করে itation এর ডিফল্ট শেলটি টিসিএস ব্যবহৃত হত তবে আমি মনে করি না বাশ ব্যবহৃত হচ্ছে না বিশেষত কারণ ওএসএক্স বের হওয়ার আগ পর্যন্ত কার্ন শেল ওপেন সোর্স ছিল না
ইউজার 151019

1
@ মার্ক, আমি বলিনি যে ওএসএক্স কখনও ksh ব্যবহার করেছে। আমি বলেছিলাম এটি zsh এর আগে ব্যবহৃত হত এবং তারা ব্যাশ (ব্যাশের একটি বিশেষ বিল্ড) এ স্যুইচ করে।
স্টাফেন চেজেলাস

1
@ এফএমপিআরফি, আপনি যদি প্রাথমিক সংস্করণগুলি দেখেন তবে বাশ ইতিমধ্যে ksh দিয়ে সাইডিং করছিল যেখানে ksh বোর্ন শেলের সাথে সামঞ্জস্যপূর্ণ ছিল না। আপনি যখন ksh88 এর মতো একই বৈশিষ্ট্য-স্তরে পৌঁছতে bash2 অবধি অপেক্ষা করতে হয়েছিল, তখন প্রাথমিকভাবে ব্যাশের ইতিমধ্যে ksh এর বেশ কয়েকটি এক্সটেনশান যেমন ইমাস $(...)/ ভিআই মোড, টিল্ড / ব্রেস এক্সপেনশন (প্রথমত সিএসএস থেকে শুরু করে), এফসি, টাইপসেট, ওরফে ছিল , কেএসএল-স্টাইলের ফাংশন সিনট্যাক্স ...
স্টাফেন চেজেলাস 25'19

8

হ্যাঁ আপনি #!/bin/shকোনও স্ক্রিপ্টে ব্যবহার করতে পারেন কারণ /bin/sh(যেমন আশা করা যায়) এই জাতীয় সিস্টেমে সরবরাহ করা হয়, সাধারণত এমন কোনও লিঙ্কের মাধ্যমে যা bashইচ্ছার মতো আচরণ করে (কমবেশি) করে sh। এখানে, উদাহরণস্বরূপ একটি Centos7 সিস্টেম আছে, যে লিঙ্ক shথেকে bash:

-bash-4.2$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Dec  4 16:48 /bin/sh -> bash
-bash-4.2$ 

আপনি #!/bin/bashযদি bashকেবল সেই সিস্টেমে স্ক্রিপ্ট লিখতে থাকেন এবং bashবৈশিষ্ট্যগুলি ব্যবহার করতে চান তবে আপনি এটিও ব্যবহার করতে পারেন । তবে, যেমন স্ক্রিপ্ট OpenBSD উদাহরণ স্বরূপ যেখানে জন্য বহনযোগ্যতা সমস্যা থেকে ক্ষতিগ্রস্ত হবে, bashশুধুমাত্র ইনস্টল করা অ্যাডমিন এটি ইনস্টল করা কষ্ট লাগে করেন (আমি না) এবং তারপর এটি ইনস্টল করা /usr/local/bin/bashনা /bin/bash। একটি কঠোরভাবে পসিক্স #!/bin/shস্ক্রিপ্ট আরও পোর্টেবল হতে হবে।


এটি দ্রষ্টব্য: "যখন অনুরোধ করা হয় তখন shব্যাশ স্টার্টআপ ফাইলগুলি পড়ার পরে পসিক্স মোডে প্রবেশ করে।" - gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode
glenn jackman

2
আমি যখন আমার চাকরিতে আরএইচইএল সার্ভারগুলির জন্য স্ক্রিপ্টগুলি লিখি, আমি #!/bin/bashসুনির্দিষ্টভাবে ব্যবহার করি যাতে আমি নন-পসিক্স বৈশিষ্ট্যগুলির সুবিধা নিতে পারি।
মন্টি হার্ড

@ মন্টিহার্ডার আইআরসি আরএইচইএল /bin/shএটি একটি সিলেট লিঙ্ক bash, এটি কি সঠিক? যদিও আমি CentOS এ নিশ্চিত তা জানি।
সের্গেই কোলোডিয়াজনি

1
@ সার্জিকিলোডিএজনি হ্যাঁ, আরএইচইএল সার্ভারে আমি সবেমাত্র যাচাই করেছি, এটিতে একটি সিমিলিংক bash। বাইনারি জানে যে নামটি শুরু করার জন্য কী নামটি ব্যবহৃত হয়েছিল এবং এটি যখন এটি বলা হয় shতখন পুরানো স্কুল বোর্নের মতো কাজ করে sh
মন্টি হার্ড

6

তুমি জিজ্ঞেস করেছিলে

উবুন্টু ডিস্ট্রিবিউশনগুলিতে লেখা শেল স্ক্রিপ্টগুলিতে মন্তব্যটি #! / bin / sh টি দেওয়া কি সঠিক?

উত্তরটি শেল স্ক্রিপ্টে আপনি কী লিখেন তার উপর নির্ভর করে।

  • আপনি যদি কঠোরভাবে পোর্টেবল POSIX- অনুবর্তী স্ক্রিপ্টগুলি ব্যবহার করেন এবং কোনও ব্যাশ-নির্দিষ্ট কমান্ড ব্যবহার না করেন তবে আপনি ব্যবহার করতে পারেন /bin/sh

  • আপনি যদি জানেন যে আপনি কেবল কোনও ব্যাশযুক্ত মেশিনে স্ক্রিপ্টটি ব্যবহার করছেন এবং আপনি ব্যাশ-নির্দিষ্ট সিনট্যাক্স ব্যবহার করতে চান তবে আপনার ব্যবহার করা উচিত/bin/bash

  • আপনি যদি নিশ্চিত হতে চান যে স্ক্রিপ্টটি ইউনিক্স মেশিনগুলির একটি ভাণ্ডারে কাজ করবে, তবে আপনার কেবল পসিক্স-কমপ্লায়েন্ট সিনট্যাক্স ব্যবহার করা উচিত এবং/bin/sh

  • আপনি নিয়মিত ব্যবহার করেন, তাহলে অন্য শেল (যেমন ksh , zsh বা tcsh শেল ), এবং আপনার স্ক্রিপ্টের মধ্যে যে সিনট্যাক্স ব্যবহার করতে চান, তাহলে আপনি উচিত উপযুক্ত অনুবাদক ব্যবহার (যেমন /bin/ksh93, /bin/zshঅথবা /bin/tcsh)


3

দ্য "#!" মন্তব্য সর্বদা ব্যবহার করে না /bin/bashবা /bin/sh। এটি কেবল শেল স্ক্রিপ্টিংয়ের জন্য নয়, দোভাষী যা হওয়া উচিত তা কেবল তালিকাভুক্ত করে। উদাহরণস্বরূপ আমার অজগর স্ক্রিপ্টগুলি সাধারণত শুরু হয় #!/usr/bin/env python

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


1

সেই সব দুর্দান্ত উত্তরের জন্য কিছুটা শীতল জল forালার জন্য দুঃখিত যেটি বলে যে /bin/shএটি সমস্ত ইউনিক্স সিস্টেমে উপস্থিত রয়েছে - এটি উপস্থিত রয়েছে, সর্বকালের সর্বাধিক ব্যবহৃত ইউনিক্স সিস্টেম বাদে: অ্যান্ড্রয়েড।

অ্যান্ড্রয়েডের শেলটি রয়েছে /system/bin/sh, এবং সাধারণত কোনও /bin/shরুট সিস্টেমে কোনও লিঙ্ক তৈরি করার কোনও উপায় নেই (কারণ সিস্টেমটি সেলিনাক্স এবং ক্ষমতাগুলি (7) বাউন্ডিং সেট ব্যবহার করে লক হয়ে যায়)।

যারা বলবেন যে অ্যান্ড্রয়েড পসিক্স-কনফর্মেন্ট নয়: বেশিরভাগ লিনাক্স এবং বিএসডি বিতরণও নয়। এবং /bin/shএই পথটির অস্তিত্ব মান দ্বারা বাধ্যতামূলক নয় :

অ্যাপ্লিকেশনগুলিতে লক্ষ্য করা উচিত যে PATHশেলের মানকটি মান হিসাবে গ্রহণ করা যায় না /bin/shবা /usr/bin/sh, এবং PATHপ্রত্যাবর্তিত জিজ্ঞাসাবাদ দ্বারা নির্ধারিত হওয়া উচিত getconf PATH, নিশ্চিত করে যে ফিরে আসা পথটি একটি শেল বিল্ট-ইন নয় absolute


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

@ ক্রিস্টোফার, কোনটি getconf? উদাহরণস্বরূপ সোলারিস ১১.৪, এটি কি এক হবে /usr/bin? এক /usr/xpg4/bin(SUSv2 সম্মতি জন্য), এক /usr/xpg6/bin(SUSv3 সম্মতি জন্য)? /usr/xpg7/bin(SUSv4 এর জন্য)?
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস যদি আমরা উদ্দেশ্যগুলি বিচার করার চেষ্টা করি তবে আমি মনে করি আমি সহজেই কিছু লিনাস টোরভাল্ডস বা থিও ডি রাড্টের এই উদ্ধৃতিটি উদ্ধৃত করতে পারি যে তারা পসিক্স সম্পর্কে তেমন গুরুত্ব দেয় না ;-) এবং বেশিরভাগ এমবেডেড সিস্টেমগুলি লিনাক্সের উপর ভিত্তি করে + ব্যস্তবক্স যা সাধারণত ইউনিক্স-এর মতো সিস্টেমের চেয়ে কম পসিক্স-কনফর্মেন্ট। আর ক) অ্যান্ড্রয়েড সত্যিই একটি "এমবেডেড" সিস্টেম ও b) একটি Android এর জন্য সিস্টেম POSIX-অনুবর্তী করা সম্ভব হয়েছে নয় ছাড়া একটি শেল থাকার /bin/sh
mosvy

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