শেল বিল্টিন কমান্ডগুলি বোঝা


12

মধ্যে ব্যাশ ম্যানুয়াল , এটা যে লেখা

Builtin commands are contained >>> within <<< the shell itself

এছাড়াও, এই উত্তরটি বলে যে

A built-in command is simply a command that the shell carries out itself,
instead of interpreting it as a request to load and run some
>>> other program <<<

আমি যখন চালানোর compgen -bউপর bash 4.4, আমি কমান্ড builtin সব শেল একটি তালিকা পাবেন। আমি উদাহরণস্বরূপ দেখতে পাই [এবং killএটি শেল বিল্টিন হিসাবে তালিকাভুক্ত। তবে তাদের আসল অবস্থানগুলি হ'ল:

/usr/bin/[
/bin/kill

আমি ভেবেছিলাম যে একটি builtinউপায় হ'ল কমান্ডটি /bin/bashএক্সিকিউটেবলের মধ্যে সংকলিত হয় । সুতরাং আসলে কী আমাকে বিভ্রান্ত করছে: দয়া করে আমাকে সংশোধন করুন, তবে builtinএটি যখন শেলের অংশ না হয়ে আলাদা কমান্ডটি কীভাবে হতে পারে ?


1
কিছু কমান্ড মূলত পৃথক ইউটিলিটি হিসাবে উপস্থিত ছিল। তাদের উপস্থিতি এখন পসিক্স স্ট্যান্ডার্ড সম্মতি, বহনযোগ্যতা, পাশাপাশি পিছনের সামঞ্জস্যের জন্য। শেলগুলি পারফরম্যান্সের জন্য অন্তর্নির্মিত কিছু প্রয়োগ করে। অন্য কারণ হতে পারে, কিন্তু এটি খুব বিস্তারিত ছাড়াই এটি সম্পর্কে।
সের্গেই কলডিয়াজনি

1
আরেকটি কারণ যা আমি ভাবতে পারি, তা হ'ল শেলটির জন্য বিশেষত কিছু বিল্ট-ইন কমান্ডের প্রয়োজন হয়, যেমন execফাইল বর্ণনাকারীদের ম্যানিপুলেট eval করা এবং আদেশগুলি মূল্যায়নের জন্য। একক কমান্ড হিসাবে তাদের প্রয়োজন নেই
সের্গেই কলডিয়াজনি

উত্তর:


16

শেলটি তৈরি করা কমান্ডগুলি প্রায়শই বিল্ট হয় যা এটি দেয় কার্যকারিতা বৃদ্ধি। কল করা হচ্ছে বাহ্যিক printf , উদাহরণস্বরূপ, নির্মিত ব্যবহার তুলনায় ধীর হয় printf

যেহেতু কিছু ইউটিলিটিগুলি নির্মাণের প্রয়োজন হয় না, যদি না সেগুলি বিশেষ, পছন্দ না হয় তবে তাদের বাহ্যিক উপযোগ cdহিসাবেও সরবরাহ করা হয় । এটি এমন যাতে স্ক্রিপ্টগুলি ভেঙে না যায় যদি সেগুলি শেল দ্বারা ব্যাখ্যা করা হয় যা একটি বিল্ড সমতুল্য সরবরাহ করে না।

কিছু শেলের বিল্ট-ইনগুলি বাহ্যিক সমমানের কমান্ডকে এক্সটেনশন সরবরাহ করে। printfউদাহরণস্বরূপ বাশের কাজটি করতে সক্ষম

$ printf -v message 'Hello %s' "world"
$ echo "$message"
Hello world

(কোনও চলকটিতে মুদ্রণ করুন) যা /usr/bin/printfবর্তমান শেল সেশনে শেল ভেরিয়েবলের অ্যাক্সেস না থাকায় (এবং এগুলি পরিবর্তন করতে পারে না) যেহেতু বাহ্যিক কেবল তা করতে সক্ষম হয় না।

ইউটিলিটি অন্তর্নির্মিত এছাড়াও করেন না যে তাদের সম্প্রসারিত কমান্ড লাইন একটি নির্দিষ্ট দৈর্ঘ্যের তুলনায় ছোটো হতে হয়েছে সীমাবদ্ধতা আছে। এরকম

printf '%s\n' *

printfশেল অন্তর্নির্মিত কমান্ড হলে তাই নিরাপদ । কমান্ড লাইনের দৈর্ঘ্যের উপর বিধিনিষেধটি execve()বাহ্যিক কমান্ড কার্যকর করতে ব্যবহৃত সি লাইব্রেরি ফাংশন থেকে আসে । যদি কমান্ড লাইন এবং বর্তমান পরিবেশ ARG_MAXবাইটের চেয়ে বড় হয় ( getconf ARG_MAXশেলের মধ্যে দেখুন ), কলটি execve()ব্যর্থ হবে। ইউটিলিটিটি শেলের মধ্যে নির্মিত হলে, কল execve()করতে হবে না।

ইউটিলিটিগুলিতে নির্মিতগুলি ইউটিলিটিগুলির চেয়ে বেশি প্রাধান্য পায় $PATH। অন্তর্নির্মিত কমান্ডটি অক্ষম করতে bash, উদাহরণস্বরূপ ব্যবহার করুন

enable -n printf

শেল হিসাবে তৈরি করা দরকার যে ইউটিলিটিগুলির একটি সংক্ষিপ্ত তালিকা রয়েছে (POSIX স্ট্যান্ডার্ডের বিশেষ বিল্ট-ইনগুলির তালিকা থেকে নেওয়া )

break
colon (:)
continue
dot (.)
eval
exec
exit
export
readonly
return
set
shift
times
trap
unset

এগুলি তৈরি করা দরকার যেহেতু তারা বর্তমান শেল সেশনের পরিবেশ এবং প্রোগ্রাম প্রবাহকে সরাসরি পরিচালনা করে। একটি বাহ্যিক ইউটিলিটি এটি করতে সক্ষম হবে না।

মজার cdবিষয় হল, এই তালিকার অংশ নয়, তবে পসিক্স সে সম্পর্কে নিম্নলিখিতটি বলেছেন :

যেহেতু cdবর্তমান শেল প্রয়োগের পরিবেশকে প্রভাবিত করে, তাই এটি সর্বদা শেল নিয়মিত অন্তর্নির্মিত হিসাবে সরবরাহ করা হয়। এটি যদি সাবসেল বা পৃথক ইউটিলিটি এক্সিকিউশন পরিবেশে ডাকা হয় যেমন নীচের একটি:

(cd /tmp)
nohup cd
find . -exec cd {} \;

এটি কলারের পরিবেশের কার্যকারী ডিরেক্টরিকে প্রভাবিত করে না।

তাই আমি ধরে নিচ্ছি যে "বিশেষ" বিল্ট-ইনগুলির বহিরাগত সমতুল্য অংশ থাকতে পারে না, cdতাত্ত্বিকভাবে থাকতে পারে (তবে এটি খুব বেশি কিছু করবে না)।


আইআইআরসি, chdir/ cdখুব প্রথম দিকে ইউনিসে / প্রাক-ইউনিক্সে forkপ্রবর্তনের আগে বহিরাগত বাইনারি ছিল।
এক্সফমিস্টার

@ এক্সফমিস্টার সোলারিস ১১.৪ (বিটা) এখনও রয়েছে /usr/bin/cd, তবে এটি প্রকৃতপক্ষে বর্তমান কার্যকারী ডিরেক্টরিটি পরিবর্তন করবে না। এর ম্যানুয়ালটিতে বলা হয়েছে: /usr/bin/cdআহ্বান প্রক্রিয়াটির কোনও প্রভাব নেই তবে প্রদত্ত ডিরেক্টরিটি বর্তমান ডিরেক্টরি হিসাবে সেট করা যায় কিনা তা নির্ধারণ করতে ব্যবহার করা যেতে পারে।
কুসালানন্দ

2
অন্যটি, বিল্টিনগুলির পরিবর্তে সুনির্দিষ্ট কারণ: বিল্টিনগুলিও দুর্দান্ত killকারণ এটির জন্য অন্য কোনও প্রক্রিয়া কাঁটাচামচ করার দরকার নেই, ভাল যদি আপনি নিজের প্রক্রিয়া সীমাতে আঘাত করেন।
ডারোবার্ট

7

আপনি (খুব বোধগম্য) এই সত্যের দ্বারা বিভ্রান্ত হয়ে পড়েছেন যে কিছু বিল্টিনগুলি বিল্টিন এবং বাহ্যিক আদেশ হিসাবে উভয়ই বিদ্যমান । সুতরাং, যখন আপনি ঠিক বলেছেন, উদাহরণস্বরূপ, একটি কমান্ড রয়েছে, এর অর্থ এই নয় যে এটির "আসল অবস্থান" রয়েছে ।/bin/[/bin

কোন সহজ উপায় এই পরীক্ষা চালানো হয় typeসঙ্গে -aসুইচ যা কমান্ডের সমস্ত উপলব্ধ দৃষ্টান্ত প্রদর্শন করা হবে। আমার আর্চ সিস্টেমে এটি দেখায়:

$ type -a [
[ is a shell builtin
[ is /sbin/[
[ is /usr/sbin/[
[ is /usr/bin/[

মনে রাখবেন /sbin, /usr/sbinএবং /binসমস্ত প্রতিলিঙ্কগুলি নির্দেশ করছে /usr/bin, সুতরাং কেবলমাত্র একটি বাহ্যিক রয়েছে [:

$ readlink -f /usr/sbin /sbin /bin/
/usr/bin
/usr/bin
/usr/bin

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


কেন ডিস্ট্রো। ইতিমধ্যে বিদ্যমান অভ্যন্তরীণ কমান্ডের জন্য পৃথক বহিরাগত কমান্ড সরবরাহ করবেন? কেন তারা সদৃশ?
লাভউইথম্যাথস

1
@ লিনাক্সউজার এর মধ্যে কয়েকটি ইউটিলিটি পসিক্সের জন্য প্রয়োজনীয় এবং আপনি বুঝতে পারবেন না যে ব্যবহারকারী যে শেলটি ব্যবহার করছে তাও একটি বিল্টিন সরবরাহ করবে কিনা। এগুলিকে ওএসের অভ্যন্তরীণ কমান্ড হিসাবে ভাবেন না, এগুলি কেবল শেলের অভ্যন্তরীণ কমান্ড এবং শেলটি পরিবর্তন করতে পারে।
টেরডন

আমার এখন সন্দেহ আছে, যদি অভ্যন্তরীণ কমান্ডগুলি শেল দ্বারা সরবরাহ করা হয়; তাহলে কে বাহ্যিক আদেশ দেয়? যেমন আমি বহু কমান্ড পর্যবেক্ষণ করেছি যা অভ্যন্তরীণ পাশাপাশি বহিরাগত কমান্ড হিসাবে উপলব্ধ, তবে আমি সেগুলি স্পষ্টভাবে ইনস্টল করেছি; তাহলে কে বাহ্যিক আদেশ দেয়? ডিস্ট্রো তাদের সঠিক প্রদান করে?
উইথম্যাথস

@linuxuser কমান্ড এবং অপারেটিং সিস্টেমের উপর নির্ভর করে। উদাহরণস্বরূপ, আমার আর্চ লিনাক্সে, প্যাকেজ এবং দ্বারা /bin/printfইনস্টল করা আছে । coreutils/bin/killutil-linux
টেরডন

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