OS #! `সিনট্যাক্সের আচরণ POSIX দ্বারা অনির্ধারিত কেন?


17

থেকে শেল কমান্ড ভাষা POSIX স্পেসিফিকেশন-এর পৃষ্ঠা:

"#!" অক্ষর দিয়ে শেল কমান্ডের ফাইলের প্রথম লাইনটি যদি শুরু হয়, ফলাফল অনির্ধারিত।

কেন #!পসিক্স দ্বারা অনির্ধারিত আচরণ ? আমি এটিকে অবাক করে দেখছি যে এত পোর্টেবল এবং বহুল ব্যবহৃত জিনিসটির একটি অনির্দিষ্ট আচরণ থাকতে পারে।


1
মানকগুলি নির্দিষ্ট আচরণগুলিতে বাস্তবায়নকে বাঁধা না দেওয়ার জন্য বিষয়গুলিকে অনির্ধারিত ছেড়ে দেয়। উদাহরণস্বরূপ, একটি "লগইন" হ'ল "অনির্দিষ্ট কার্যকলাপ যার মাধ্যমে কোনও ব্যবহারকারী সিস্টেমে অ্যাক্সেস অর্জন করে।"
কুসালানন্দ

2
যেহেতু পসিএক্স এক্সিকিউটেবল পাথগুলি নির্দিষ্ট করে না, একটি শেবাং লাইন কোনওভাবেই সহজাতভাবে বহনযোগ্য নয়; আমি নিশ্চিত না নির্বিশেষে নির্দিষ্ট করে অনেক অর্জন করা হবে।
মাইকেল হোমার

1
@ মিশেলহোমর, অবশ্যই না? স্ট্যান্ডার্ডটি উল্লেখ করতে পারে যে লাইনে দোভাষীটির জন্য ব্যবহারের জন্য একটি পথ রয়েছে, এমনকি সেই পথটি কী হবে তা না জানিয়ে।
ilkkachu

1
@ হারল্ডফিশার এটি শেলের দ্বারা ব্যাখ্যা না করে এটি ওএস কার্নেল দ্বারা ব্যাখ্যা করা হয় (কমপক্ষে লিনাক্সে সম্পন্ন হয়, যা প্রকৃতপক্ষে বিল্ডিংয়ের সময় এই সমর্থনটি অক্ষম করতে পারে), বা যে কোনও গ্রন্থাগার exec()ফাংশন প্রয়োগ করে । সুতরাং একাধিক শেলের বিপরীতে চেক করা সত্যিই আপনাকে জানায় না যে এটি কতটা পোর্টেবল।
অস্টিন হেমেলগার্ন

2
@ হারল্ডফিশার আরও, এমনকি পসিক্স-আনুগত্যকারী ওএসগুলির মধ্যেও আচরণটি সামঞ্জস্যপূর্ণ নয়। লিনাক্স এবং ম্যাকোস পৃথকভাবে আচরণ করে: লিনাক্স শ্যাবাং লাইনগুলি ফাঁক করে পুরোপুরি টোকানাইজ করে না। ম্যাকোস স্ক্রিপ্ট ইন্টারপ্রেটারকে অন্য স্ক্রিপ্ট হতে দেয় না। আরো দেখুন en.wikipedia.org/wiki/Shebang_(Unix)#Portability
jamesdlin

উত্তর:


21

আমি মূলত বলে মনে করি কারণ:

  • আচরণ বাস্তবায়নের মধ্যে ব্যাপকভাবে পরিবর্তিত হয়। সমস্ত বিশদ জানতে https://www.in-ulm.de/~mascheck/various/shebang/ দেখুন ।

    এটি এখন বেশিরভাগ ইউনিক্সের মতো প্রয়োগের একটি ন্যূনতম উপসেট নির্দিষ্ট করতে পারে: যেমন #! *[^ ]+( +[^ ]+)?\n(সেই দুটি বা দুটি শব্দের মধ্যে পোর্টেবল ফাইলনাম অক্ষরের কেবল অক্ষর রয়েছে) যেখানে প্রথম শব্দটি একটি দেশীয় নির্বাহের জন্য পরম পথ, জিনিসটি নয় এক্সিকিউটেবল সেটিউড / সেটজিড, এবং বাস্তবায়ন সংজ্ঞা প্রদানকারী বা স্ক্রিপ্ট পথ argv[0]দোভাষী হিসাবে প্রেরণ করা হয়েছে কিনা তা নির্ধারিত হলে খুব দীর্ঘ এবং আচরণ অনির্দিষ্ট ।

  • পসিক্স যাইহোক এক্সিকিউটেবলের পথ নির্দিষ্ট করে না। বেশ কিছু ব্যবস্থা প্রাক POSIX আছে ইউটিলিটি মধ্যে /bin/ /usr/binএবং অন্য কোথাও (সোলারিস 10 যেখানে মত POSIX ইউটিলিটি আছে /bin/shএকটি বোর্ন শেল এবং POSIX এক হয় /usr/xpg4/bin; সোলারিস 11 ksh93 যা প্রায়ই POSIX অনুবর্তী হয়, কিন্তু সঙ্গে এটি প্রতিস্থাপিত অন্যান্য অধিকাংশ সরঞ্জামগুলি /binএখনও প্রাচীন নন-পসিক্সগুলি রয়েছে)। কিছু সিস্টেমে পসিক্স নয় তবে একটি পসিক্স মোড / এমুলেশন রয়েছে। সমস্ত পসিক্সের প্রয়োজন হ'ল একটি ডকুমেন্টেড এনভায়রনমেন্ট যাতে কোনও সিস্টেম পসিক্সলি আচরণ করে।

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

    সুতরাং পসিক্স শেবাং প্রক্রিয়া নির্দিষ্ট করে থাকলেও পসিক্স sh/ sed/ awk... স্ক্রিপ্টগুলি লেখার জন্য এটি ব্যবহার করা যায় না (এটিও নোট করুন যে শেবাং প্রক্রিয়াটি নির্ভরযোগ্য sed/ awkস্ক্রিপ্ট লিখতে ব্যবহার করা যাবে না কারণ এটি বিকল্পের শেষের দিকে যেতে দেয় না) মার্কার)।

এখন এটিকে অনির্দিষ্ট করা হয়েছে এর অর্থ এই নয় যে আপনি এটি ব্যবহার করতে পারবেন না (ভাল, এটি বলছে যে আপনি যদি প্রথম লাইনের সাথে শুরু না করে থাকেন #!তবে আপনি এটি কেবল একটি নিয়মিত মন্তব্য করবেন এবং শে-ব্যাং নয়), তবে POSIX আপনাকে কোনও গ্যারান্টি দেয় না যদি আপনি তা করেন।

আমার অভিজ্ঞতায় শেবাংগুলি আপনাকে পসিক্সের শেল স্ক্রিপ্টগুলি লেখার পদ্ধতি ব্যবহারের চেয়ে বহনযোগ্যতার আরও গ্যারান্টি দেয়: শি-ব্যাং ছেড়ে দিন, পসিক্স shসিনট্যাক্সে স্ক্রিপ্টটি লিখুন এবং আশা করি যে স্ক্রিপ্টটি যা কিছু প্রত্যাখ্যান shকরে তাতে এটিতে একটি পসিক্স অনুগত হয়, যা হ'ল ঠিক আছে যদি আপনি জানেন তবে স্ক্রিপ্টটি সঠিক পরিবেশে সঠিক সরঞ্জাম দ্বারা ডাকা হবে তবে অন্যথায় নয়।

আপনার মতো জিনিসগুলি করতে হতে পারে:

#! /bin/sh -
if : ^ false; then : fine, POSIX system by default
else
  # cover Solaris 10 or older. ": ^ false" returns false
  # in the Bourne shell as ^ is an alias for | there for
  # compatibility with the Thomson shell.
  PATH=`getconf PATH`:$PATH; export PATH
  exec /usr/xpg4/bin/sh - "$0" ${1+"$@"}
fi
# rest of script

আপনি যদি উইন্ডোজ + সাইগউইনে পোর্টেবল হতে চান তবে আপনাকে নিজের ফাইলটির নাম .batবা .ps1এক্সটেনশন দিয়ে নাম লিখতে হতে পারে এবং একই ফাইলের জন্য সাইগউইনকে অনুরোধ করতে cmd.exeবা অনুরোধ powershell.exeকরতে পারে sh


মজার বিষয় হচ্ছে, 5 ইস্যু থেকে : "কনস্ট্রাক্ট #! সেই এক্সটেনশনটি সরবরাহ করতে ইচ্ছুক বাস্তবায়নের জন্য সংরক্ষিত A একটি পোর্টেবল অ্যাপ্লিকেশন শেল স্ক্রিপ্টের প্রথম লাইন হিসাবে # ব্যবহার করতে পারে না; এটি কোনও মন্তব্য হিসাবে ব্যাখ্যা করা যায় না।"
মুড়ু

@ মুরু যদি স্ক্রিপ্টটি সত্যই পোর্টেবল হয় তবে পসিক্স চলমান সত্যিকারের পসিক্স সিস্টেমে shএটির জন্য হ্যাশব্যাং লাইন লাগবে না কারণ এটি পসিক্স দ্বারা কার্যকর করা হবে sh
কুসালানন্দ

1
@Kusalananda যে একমাত্র সত্য যদি এর execlpবা execvpব্যবহার করা হয়, ঠিক? আমি যদি ব্যবহার execveকরতে পারি তবে এটি ENOEXEC এর ফলস্বরূপ হবে?
মুড়ু

9

[টি] তাঁর আচরণ সমস্ত পসিক্স-অভিযোগ শেলের মধ্যে সামঞ্জস্যপূর্ণ বলে মনে হয়। আমি এখানে উইগল রুমের প্রয়োজনীয়তাটি দেখছি না।

আপনি যথেষ্ট গভীরভাবে খুঁজছেন না।

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

দ্রষ্টব্য যে BSD ফাইলগুলি #! interpreterসরাসরি সম্পাদন করার অনুমতি দেয়, যখন SysV কেবলমাত্র a.out ফাইলগুলিকে সরাসরি সম্পাদন করার অনুমতি দেয়। এর অর্থ হ'ল exec…()বিএসডি প্রোগ্রামের একটি রুটিনের উদাহরণটি /bin/shপরিবর্তে সেই প্রোগ্রামটির জন্য দোভাষী (সাধারণত ) কার্যকর করতে সিসভের অধীনে পরিবর্তন করতে হতে পারে ।
- স্টিফেন ফ্রেডি (1988)। "সিস্টেম এক্স রিলিজ ওয়াই" তে প্রোগ্রামিং। অস্ট্রেলিয়ান ইউনিক্স সিস্টেম ব্যবহারকারী গ্রুপ নিউজলেটার । খণ্ড 9. সংখ্যা 4 পি। 111।

এখানে একটি গুরুত্বপূর্ণ বিষয় হ'ল আপনি শেলগুলির দিকে তাকিয়ে রয়েছেন, অন্যদিকে এক্সিকিউটেবল শেল স্ক্রিপ্টগুলির অস্তিত্ব exec…()কার্যকারিতাগুলির জন্য একটি বিষয় । শেলগুলি যা করতে পারে তার মধ্যে এক্সিকিউটেবল স্ক্রিপ্ট প্রক্রিয়াটির পূর্বসূরী রয়েছে , এখনও কিছু শেলের মধ্যে এখনও পাওয়া যায় (এবং আজকাল এছাড়াও exec…p()ফাংশনগুলির সাবসেটের জন্য বাধ্যতামূলক ) এবং কিছুটা বিভ্রান্তিকর। এক্ষেত্রে স্ট্যান্ডার্ডকে যা বোঝাতে হবে তা হ'ল exec…()কোনও ব্যাখ্যাযুক্ত স্ক্রিপ্ট কীভাবে কাজ করে এবং পসিক্স মূলত তৈরি হয়েছিল সেই সময়ে লক্ষ্য অপারেটিং সিস্টেমগুলির বর্ণালীটির একটি বড় অংশ জুড়ে এটি প্রথম স্থানটিতে কাজ করে না

একটি অধীনতর প্রশ্ন হল যেহেতু এটিকে কেন মানিক করা হয়নি, বিশেষত স্ক্রিপ্ট দোভাষীদের জন্য যাদু সংখ্যা প্রক্রিয়া মহাবিশ্বের এটিএন্ডটি টি-তে জনসাধারণের কাছে পৌঁছেছিল এবং 1990 এর দশকের শেষের দিকে সিস্টেম 5 ইন্টারফেস সংজ্ঞায় দলিল করা exec…()হয়েছিল :

একটি দোভাষী ফাইল ফর্মের একটি লাইন দিয়ে শুরু হয়

#! পথের নাম [আরগ]
যেখানে পথের নাম হ'ল দোভাষীর পথ এবং আর্গ একটি alচ্ছিক যুক্তি। আপনি যখন execকোনও দোভাষী ফাইল করেন তখন সিস্টেমটি execনির্দিষ্ট দোভাষী হয়।
- execসিস্টেম ভি ইন্টারফেস সংজ্ঞা । আয়তন 1. 1991।

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

আরও পড়া


1

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

এছাড়াও http://en.wikedia.org/wiki/Shebang_(Unix)#Portability দেখুন

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