বহিরাগত বাস্তবায়ন করার জন্য কেন পসিক্সের নির্দিষ্ট শেল বিল্ট-ইনগুলির প্রয়োজন?


19

মুদ্রণযন্ত্রটি ইয়াশের জন্য অন্তর্নির্মিত কিনা এই প্রশ্ন থেকে এই উত্তরটি আসে যা পসিএক্স মানকে উদ্ধৃত করে

উত্তরটি নির্দেশ করে যে পসিক্স অনুসন্ধান ক্রমটি হ'ল কাঙ্ক্ষিত কমান্ডের একটি বাহ্যিক বাস্তবায়ন সন্ধান করা এবং তারপরে শেল যদি এটি বিল্ট-ইন হিসাবে প্রয়োগ করে থাকে তবে বিল্ট-ইন চালান। (বিল্ট-ইনগুলির জন্য যা বিশেষ বিল্ট-ইনগুলি নয় ))

অভ্যন্তরীণ বাস্তবায়ন চালানোর অনুমতি দেওয়ার আগে বহিরাগত প্রয়োগের জন্য পসিক্সের কেন এই প্রয়োজনীয়তা রয়েছে?

মনে হচ্ছে ... নির্বিচারে, তাই আমি কৌতূহলী।


আমি বিশ্বাস করি এটি যদি প্রয়োজন / প্রয়োজন হয় তবে বিল্টিনগুলি সক্ষম / অক্ষম করার একটি উপায়।
ইসহাক

2
বাহ্যিক বাস্তবায়ন সরিয়ে বিল্ট-ইন অক্ষম করছেন? এখন নামের কোনও আদেশ নেই printf
স্টাডোগ

@ স্টুডোগ, সুতরাং বিল্ট-ইন হিসাবে একই নামে একটি খালি ফাইল তৈরি করুন, এক্সিকিউটিভ বিটটি চালু করুন এবং এটি আপনার প্যাথের একটি ডিরেক্টরিতে রাখুন। : পি
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড একটি কঠোরভাবে মেনে চলার শেলটি অনুসন্ধানের সময় নামটি দেখতে পাবে PATHএবং তারপরে বাইরের স্ক্রিপ্টকে নয়, বিল্ট-ইন ইউটিলিটি কল করত not আপনি যদি আপনার পথে বাহ্যিক স্ক্রিপ্টটি কল করতে চান? হুম ... এটি বিভিন্ন সম্ভাবনার বর্ণনা দেওয়ার জন্য একটি টেবিলের জন্য কল করবে বলে মনে হচ্ছে। এখানে একটি আছে , তবে এটি আমার কাছে বোধগম্য নয়।
কুসালানন্দ

@ কুসালানন্দ, আপনার প্রথম বাক্যটি আবার বলুন, এটাই আমার বক্তব্য। সুতরাং আমি কেন একটি খালি ফাইল তৈরি করতে বলেছি ।
ওয়াইল্ডকার্ড

উত্তর:


15

এটি একটি "যেন" নিয়ম।

সোজা কথায়: ব্যবহারকারী যদি দেখেন যে শেলটির আচরণটি পরিবর্তন করা উচিত নয় তবে যদি কোনও প্রয়োগ কোনও শেল অন্তর্নির্মিত হিসাবে প্রমিত বাইরের কমান্ডটি উপলব্ধ করার সিদ্ধান্ত নেয়।

Https://unix.stackexchange.com/a/496291/5132 এ আমি যে বিপরীতে দেখিয়েছি (একদিকে) পিডি কর্ন, মিরবিএসডি কর্ন এবং হেরলুম বোর্ন শেলগুলির আচরণের মধ্যে; (অন্যদিকে) জেড, 93 কর্ন, বোর্ন অ্যাগেইন, এবং ডেবিয়ান অ্যালকুইস্ট শেল; এবং (গ্রিপিং হাতে) ওয়াটানাবে শেল এটি হাইলাইট করে।

শাঁস আছে না যে জন্য printfযেমন একটি বিল্ট-ইন, অপসারণ /usr/binথেকে PATHএকজন আবাহন তোলে printfস্টপ কাজ। পটিক্স কনফরম্যান্ট আচরণ, ওয়াটানাবে শেল দ্বারা এর কনফরমেন্ট মোডে প্রদর্শিত, একই ফলাফলের কারণ হয়। printfঅন্তর্নির্মিত শেলটির আচরণটি যেন কোনও বাহ্যিক আদেশকে ডেকে আনে ।

যদিও অপ-কনফরম্যান্ট শেলগুলির সকলের আচরণ /usr/binবাদ দেওয়া হয় না PATHএবং সেগুলি এমনভাবে আচরণ করে না যে তারা কোনও বাহ্যিক আদেশ ব্যবহার করে।

স্ট্যান্ডার্ডটি আপনাকে গ্যারান্টি দেওয়ার চেষ্টা করছে তা হ'ল শেলগুলি সাধারণত সব ধরণের বাহ্যিক কমান্ড (বা তাদের নিজস্ব শেল ফাংশন হিসাবে প্রয়োগ করতে পারে) তৈরি করতে পারে এবং আপনি এখনও বিল্ট-ইনগুলি থেকে একই আচরণ পাবেন যা আপনি করেছেন বাহ্যিক কমান্ডগুলির সাথে যদি আপনি PATHআদেশগুলি সন্ধান থেকে বিরত হন তবে সামঞ্জস্য করুন । PATHআপনি যে আদেশগুলি প্রার্থনা করতে পারেন তা নির্বাচন এবং নিয়ন্ত্রণ করার জন্য আপনার সরঞ্জাম হিসাবে রয়ে গেছে।

(যেমন /unix//a/448799/5132 তে ব্যাখ্যা করা হয়েছে , বহু বছর আগে লোকেরা কী ছিল তা পরিবর্তন করে তাদের ইউনিক্সের ব্যক্তিত্বকে বেছে নিয়েছিল PATH))

যে কেউ মন্তব্য করতে পারে যে কমান্ডটি পাওয়া যায় কিনা তা নির্বিশেষে সর্বদা কাজ করে PATH আসলে বাস্তবে অন্তর্নির্মিত বহিরাগত কমান্ডগুলি তৈরি করার বিষয়টি । (এ কারণেই আমার নশ টুলসেটটি কেবলমাত্র printenv1.38 সংস্করণে একটি বিল্ট-ইন কমান্ড পেয়েছে, যদিও এটি শেল নয় ))

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

আরও পড়া


13

এটি বেশ অযৌক্তিক এবং এজন্য কোনও শেল এটির ডিফল্ট মোডে প্রয়োগ করছে না।

স্ট্যান্ডার্ডের যুক্তি এবং এর উদাহরণস্বরূপ উদাহরণটি বোঝায় যে এটি কোনও পাথের সাথে নিয়মিত অন্তর্নির্মিত থাকার একটি বোকা চেষ্টা ছিল এবং ব্যবহারকারীকে তার নিজস্ব বাইনারিটি এটির সামনে উপস্থিত হওয়ার দ্বারা এটিকে ওভাররাইড করতে দেয় PATH(উদাহরণস্বরূপ একটি printfবিল্ট-ইন এর সাথে যুক্ত সেট /usr/bin/printfকরে /foo/bin/printfবাইরের কমান্ড দ্বারা ওভাররাইড করা যেতে পারে PATH=/foo/bin:$PATH)।

যাইহোক, মানটির প্রয়োজনীয়তাটি শেষ হয় নি, তবে সম্পূর্ণ ভিন্ন কিছু (এবং অকেজো এবং অপ্রত্যাশিতও)।

আপনি এই বাগ রিপোর্টটিতে আরও এটি পড়তে পারেন । চূড়ান্ত স্বীকৃত পাঠ্য থেকে উদ্ধৃত :

প্রচুর বিদ্যমান প্রয়োগগুলি PATH অনুসন্ধান না করে নিয়মিত অন্তর্নির্মিত সম্পাদন করে। এই আচরণটি আদর্শ পাঠ্যের সাথে মেলে না এবং স্ক্রিপ্ট লেখকদের একটি বিশেষভাবে তৈরি কারিগর PATH- র মাধ্যমে নিয়মিত অন্তর্নির্মিত ইউটিলিটিগুলিকে ওভাররাইড করার অনুমতি দেয় না। তদতিরিক্ত, যুক্তিটি ব্যাখ্যা করে যে উদ্দেশ্যটি হ'ল লেখকরা পিএটিএইচ সংশোধন করে বিল্ট-ইনগুলি ওভাররাইড করার অনুমতি দেবেন , তবে আদর্শ পাঠ্যটি এটি বলে না

এফডাব্লুআইডাব্লু, আমি মনে করি না যে কোনও শেল গ্রহণযোগ্য পাঠ্য থেকে সংশোধিত প্রয়োজনীয়তা বাস্তবায়ন করবে।


আর্টিকেল . gmane.org/gmane.comp.standards.posix.austin.general/… এ আরও আলোচনা দেখুন (এবং আরও বেশ কিছু লোক রয়েছে)।
স্টাফেন চেজেলাস


না, (উদাহরণস্বরূপ , / usr / bin / printf এর সাথে অন্তর্নির্মিত একটি প্রিন্টফিট PATH = / foo / bin: $ PATH সেট করে / foo / bin / printf বাহ্যিক কমান্ড দ্বারা ওভাররাইড করা যেতে পারে)। , এটি ভুল। উভয়ই / উভয়ই / PATH এর যে কোনও /usr/bin/printfবা অস্তিত্ব বিল্টিন প্রিন্টফকে/foo/bin/printf সক্রিয় করবে । একমাত্র অনুপস্থিত (প্যাথএইচএইচ) বাহ্যিকটি কেবল বিল্টিনটি অক্ষম করে। ( অনুমানের চিঠির মাধ্যমে) printf
আইজাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.