cdএটি একটি পসিক্স-ম্যান্ডেন্ডেট শেল অন্তর্নির্মিত:
যদি একটি সাধারণ কমান্ডের ফলে কমান্ডের নাম এবং যুক্তিগুলির একটি listচ্ছিক তালিকার ফলাফল হয় তবে নিম্নলিখিত ক্রিয়া সম্পাদন করা হবে:
- যদি কমান্ডের নামটিতে কোনও স্ল্যাশ না থাকে তবে নিম্নলিখিত ক্রমের প্রথম সফল পদক্ষেপটি উপস্থিত হবে:
...
- কমান্ডের নামটি যদি নিম্নলিখিত সারণীতে তালিকাভুক্ত কোনও ইউটিলিটির নামের সাথে মেলে, তবে সেই ইউটিলিটিটি চাওয়া হবে।
...
cd
...
- অন্যথায়, কমান্ডটি PATH ব্যবহারের জন্য অনুসন্ধান করা হবে ...
যদিও এটি স্পষ্টভাবে বলে না যে এটি একটি অন্তর্নির্মিত হতে হবে, স্পেসিফিকেশনটি বলতে গেলে, এর বর্ণনায়cd :
যেহেতু সিডি বর্তমান শেল প্রয়োগের পরিবেশকে প্রভাবিত করে, তাই এটি সর্বদা শেল নিয়মিত অন্তর্নির্মিত হিসাবে সরবরাহ করা হয়।
bashম্যানুয়াল থেকে :
বোর্ন শেল থেকে নিম্নলিখিত শেল বিল্টিন কমান্ডগুলি উত্তরাধিকার সূত্রে প্রাপ্ত। এই আদেশগুলি POSIX মান দ্বারা নির্দিষ্ট হিসাবে প্রয়োগ করা হয়।
...
cd
cd [-L|[-P [-e]]] [directory]
আমি মনে করি এটি আপনি এমন কোনও স্থাপত্যের কথা ভাবতে cdপারেন যেখানে বিল্টিন হতে হবে না। তবে আপনাকে দেখতে হবে একটি বিল্ট-ইন কী বোঝায় what আপনি যদি কিছু কমান্ডের জন্য শেলটিতে কিছু করার জন্য বিশেষ কোড লিখেন তবে আপনি একটি বিল্টিন স্থাপনের কাছাকাছি চলে যাচ্ছেন। আপনি যত বেশি করেন, কেবল একটি বিল্টিন থাকাই ভাল।
উদাহরণস্বরূপ, আপনার শেলটির উপ-প্রক্রিয়াগুলির সাথে যোগাযোগের জন্য আইপিসি থাকতে পারে, এবং এমন একটি cdপ্রোগ্রাম রয়েছে যা ডিরেক্টরিটির অস্তিত্ব পরীক্ষা করতে পারে এবং আপনার অ্যাক্সেসের অনুমতি রয়েছে কিনা এবং তারপরে শেলটি পরিবর্তন করার জন্য এটির সাথে যোগাযোগ করে ডিরেক্টরি। যাইহোক, আপনাকে অবশ্যই পরীক্ষা করতে হবে যে আপনার সাথে যোগাযোগ করার প্রক্রিয়াটি একটি শিশু কিনা (বা কেবলমাত্র শিশুদের সাথে যোগাযোগের বিশেষ মাধ্যম তৈরি করুন, যেমন একটি বিশেষ ফাইল বিবরণকারী, ভাগ করা মেমরি ইত্যাদি), এবং যদি প্রক্রিয়াটি বাস্তবে হয় বিশ্বস্ত cdপ্রোগ্রাম বা অন্য কিছু চলমান । এটি কৃমি একটি সম্পূর্ণ ক্যান।
অথবা আপনার কাছে এমন একটি cdপ্রোগ্রাম থাকতে পারে যা chdirসিস্টেম কল করে এবং নতুন শেলের সাথে সমস্ত বর্তমান পরিবেশের ভেরিয়েবল প্রয়োগ করে একটি নতুন শেল শুরু করে, এবং তারপরে এটির প্যারেন্ট শেলটিকে (কোনওভাবে) হত্যা করে। 1
সবচেয়ে খারাপ, এমনকি আপনার এমন একটি সিস্টেম থাকতে পারে যেখানে কোনও প্রক্রিয়া অন্যান্য প্রক্রিয়াগুলির পরিবেশকে পরিবর্তিত করতে পারে (আমার মনে হয় প্রযুক্তিগতভাবে আপনি এটি ডিবাগার দিয়ে করতে পারেন)। তবে এই জাতীয় ব্যবস্থা খুব খুব দুর্বল হবে।
আপনি এই জাতীয় পদ্ধতিগুলিকে সুরক্ষিত করার জন্য নিজেকে আরও এবং আরও কোড যুক্ত করে দেখতে পাবেন এবং এটিকে বিল্টিন হিসাবে তৈরি করা যথেষ্ট সহজ।
যে কোনও বিষয় কার্যকর করার যোগ্য এটি এটিকে বিল্টিন হওয়া থেকে বাধা দেয় না। বিন্দু ক্ষেত্রে:
echo এবং test
echoএবং testPOSIX- আদেশযুক্ত ইউটিলিটিগুলি ( /bin/echoএবং /bin/test)। তবুও প্রায় প্রতিটি জনপ্রিয় শেলের একটি বিল্টিন রয়েছে echoএবং test। একইভাবে, killএটি অন্তর্নির্মিত যা একটি প্রোগ্রাম হিসাবে উপলব্ধ। অন্যদের মধ্যে রয়েছে:
sleep (সাধারণ হিসাবে না)
time
false
true
printf
যাইহোক, কিছু ক্ষেত্রে রয়েছে যেখানে কমান্ড একটি বিল্টিন ছাড়া কিছুই হতে পারে না। এর মধ্যে অন্যতম cd। সাধারণত, যদি পুরো পাথটি নির্দিষ্ট না করা হয় এবং কমান্ডের নামটি কোনও বিল্টিনের সাথে মেলে তবে command কমান্ডের জন্য উপযুক্ত একটি ফাংশন বলা হয়। শেলের উপর নির্ভর করে বিল্টিন এবং এক্সিকিউটেবলের আচরণের পার্থক্য থাকতে পারে (এটি বিশেষত একটি সমস্যাecho যার জন্য বন্যভাবে পৃথক আচরণ রয়েছে you আপনি যদি আচরণ সম্পর্কে নিশ্চিত হতে চান তবে এটি ব্যবহার করে এক্সিকিউটিভকে কল করা পছন্দনীয় সম্পূর্ণ পাথ এবং ভেরিয়েবলগুলি সেট করুন POSIXLY_CORRECT(তারপরেও সত্যিকারের কোনও গ্যারান্টি নেই)।
প্রযুক্তিগতভাবে এমন কোনও ওএস সরবরাহ করা থেকে বিরত করার মতো কিছুই নেই যা শেলও এবং এতে বিল্টিন হিসাবে প্রতিটি কমান্ড রয়েছে। এই চূড়ান্ত প্রান্তের কাছাকাছি একরকম ব্যাসিবক্স । ব্যাসিবক্স একটি একক বাইনারি, এটি (যার সাথে এটি বলা হয় তার উপর নির্ভর করে) অ্যালকুইস্ট শেল ( ) সহ 240 টিরও বেশি প্রোগ্রামের মতো আচরণ করতে পারে ash। আপনি যদি PATHব্যাসিবক্স চালানোর সময় আনসেট না করে থাকেন তবে বুসিবক্সে ashউপলভ্য প্রোগ্রামগুলি নির্দিষ্ট করে না দিয়ে এখনও আপনার কাছে অ্যাক্সেসযোগ্য PATH। এগুলি শেল বিল্টিন হওয়ার কাছাকাছি আসে, ব্যতীত শেলটি নিজেই ব্যাসিবক্সে এক ধরণের বিল্টিন।
যদি আপনি dashউত্সটি দেখেন তবে এক্সিকিউশন থ্রেডটি হ'ল কিছু (অবশ্যই পাইপ এবং অন্যান্য জিনিস ব্যবহার করার সময় অতিরিক্ত ক্রিয়াকলাপের সাথে জড়িত):
main→ cmdloop→ evaltree→evalcommand
evalcommandতারপরে findcommandআদেশটি কী তা নির্ধারণ করতে ব্যবহার করে। যদি এটি অন্তর্নির্মিত হয় তবে :
case CMDBUILTIN:
if (spclbltin > 0 || argc == 0) {
poplocalvars(1);
if (execcmd && argc > 1)
listsetvar(varlist.list, VEXPORT);
}
if (evalbltin(cmdentry.u.cmd, argc, argv, flags)) {
if (exception == EXERROR && spclbltin <= 0) {
FORCEINTON;
break;
cmdentry.u.cmdএকটি struct( struct builtincmd), এক যার সদস্যদের একটি ফাংশন পয়েন্টার, একটি স্বাক্ষর টিপিক্যাল সঙ্গে main: (int, char **)। evalbltinফাংশান কল (তার উপর নির্ভর করে কিনা builtin হয় evalকমান্ড বা না হোক) পারেন evalcmd, কিংবা এই ফাংশন পয়েন্টার। আসল ফাংশনগুলি বিভিন্ন উত্স ফাইলগুলিতে সংজ্ঞায়িত করা হয়। echoউদাহরণস্বরূপ :
int
echocmd(int argc, char **argv)
{
int nonl;
nonl = *++argv ? equal(*argv, "-n") : 0;
argv += nonl;
do {
int c;
if (likely(*argv))
nonl += print_escape_str("%s", NULL, NULL, *argv++);
if (nonl > 0)
break;
c = *argv ? ' ' : '\n';
out1c(c);
} while (*argv);
return 0;
}
এই বিভাগে উত্স কোডের সমস্ত লিঙ্কগুলি লাইন নম্বর-ভিত্তিক, সুতরাং সেগুলি বিজ্ঞপ্তি ছাড়াই পরিবর্তন হতে পারে।
1 পসিক্স সিস্টেমে cdএক্সিকিউটেবল থাকে ।
সাইড নোট:
ইউনিক্স এবং লিনাক্সে শেল আচরণের সাথে সম্পর্কিত অনেকগুলি দুর্দান্ত পোস্ট রয়েছে। নির্দিষ্টভাবে:
যদি আপনি এখনও পর্যন্ত তালিকাভুক্ত প্রশ্নগুলির কোনও নমুনাটি লক্ষ্য না করেন, তবে তাদের প্রায় সবগুলিতে স্টাফেন চেজেলাস জড়িত ।
typeকমান্ডটি ব্যবহার করার পরামর্শ দেওয়া হয়েছে