শেলটি তৈরি করা কমান্ডগুলি প্রায়শই বিল্ট হয় যা এটি দেয় কার্যকারিতা বৃদ্ধি। কল করা হচ্ছে বাহ্যিক 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
তাত্ত্বিকভাবে থাকতে পারে (তবে এটি খুব বেশি কিছু করবে না)।