cd
এটি একটি পসিক্স-ম্যান্ডেন্ডেট শেল অন্তর্নির্মিত:
যদি একটি সাধারণ কমান্ডের ফলে কমান্ডের নাম এবং যুক্তিগুলির একটি listচ্ছিক তালিকার ফলাফল হয় তবে নিম্নলিখিত ক্রিয়া সম্পাদন করা হবে:
- যদি কমান্ডের নামটিতে কোনও স্ল্যাশ না থাকে তবে নিম্নলিখিত ক্রমের প্রথম সফল পদক্ষেপটি উপস্থিত হবে:
...
- কমান্ডের নামটি যদি নিম্নলিখিত সারণীতে তালিকাভুক্ত কোনও ইউটিলিটির নামের সাথে মেলে, তবে সেই ইউটিলিটিটি চাওয়া হবে।
...
cd
...
- অন্যথায়, কমান্ডটি PATH ব্যবহারের জন্য অনুসন্ধান করা হবে ...
যদিও এটি স্পষ্টভাবে বলে না যে এটি একটি অন্তর্নির্মিত হতে হবে, স্পেসিফিকেশনটি বলতে গেলে, এর বর্ণনায়cd
:
যেহেতু সিডি বর্তমান শেল প্রয়োগের পরিবেশকে প্রভাবিত করে, তাই এটি সর্বদা শেল নিয়মিত অন্তর্নির্মিত হিসাবে সরবরাহ করা হয়।
bash
ম্যানুয়াল থেকে :
বোর্ন শেল থেকে নিম্নলিখিত শেল বিল্টিন কমান্ডগুলি উত্তরাধিকার সূত্রে প্রাপ্ত। এই আদেশগুলি POSIX মান দ্বারা নির্দিষ্ট হিসাবে প্রয়োগ করা হয়।
...
cd
cd [-L|[-P [-e]]] [directory]
আমি মনে করি এটি আপনি এমন কোনও স্থাপত্যের কথা ভাবতে cd
পারেন যেখানে বিল্টিন হতে হবে না। তবে আপনাকে দেখতে হবে একটি বিল্ট-ইন কী বোঝায় what আপনি যদি কিছু কমান্ডের জন্য শেলটিতে কিছু করার জন্য বিশেষ কোড লিখেন তবে আপনি একটি বিল্টিন স্থাপনের কাছাকাছি চলে যাচ্ছেন। আপনি যত বেশি করেন, কেবল একটি বিল্টিন থাকাই ভাল।
উদাহরণস্বরূপ, আপনার শেলটির উপ-প্রক্রিয়াগুলির সাথে যোগাযোগের জন্য আইপিসি থাকতে পারে, এবং এমন একটি cd
প্রোগ্রাম রয়েছে যা ডিরেক্টরিটির অস্তিত্ব পরীক্ষা করতে পারে এবং আপনার অ্যাক্সেসের অনুমতি রয়েছে কিনা এবং তারপরে শেলটি পরিবর্তন করার জন্য এটির সাথে যোগাযোগ করে ডিরেক্টরি। যাইহোক, আপনাকে অবশ্যই পরীক্ষা করতে হবে যে আপনার সাথে যোগাযোগ করার প্রক্রিয়াটি একটি শিশু কিনা (বা কেবলমাত্র শিশুদের সাথে যোগাযোগের বিশেষ মাধ্যম তৈরি করুন, যেমন একটি বিশেষ ফাইল বিবরণকারী, ভাগ করা মেমরি ইত্যাদি), এবং যদি প্রক্রিয়াটি বাস্তবে হয় বিশ্বস্ত cd
প্রোগ্রাম বা অন্য কিছু চলমান । এটি কৃমি একটি সম্পূর্ণ ক্যান।
অথবা আপনার কাছে এমন একটি cd
প্রোগ্রাম থাকতে পারে যা chdir
সিস্টেম কল করে এবং নতুন শেলের সাথে সমস্ত বর্তমান পরিবেশের ভেরিয়েবল প্রয়োগ করে একটি নতুন শেল শুরু করে, এবং তারপরে এটির প্যারেন্ট শেলটিকে (কোনওভাবে) হত্যা করে। 1
সবচেয়ে খারাপ, এমনকি আপনার এমন একটি সিস্টেম থাকতে পারে যেখানে কোনও প্রক্রিয়া অন্যান্য প্রক্রিয়াগুলির পরিবেশকে পরিবর্তিত করতে পারে (আমার মনে হয় প্রযুক্তিগতভাবে আপনি এটি ডিবাগার দিয়ে করতে পারেন)। তবে এই জাতীয় ব্যবস্থা খুব খুব দুর্বল হবে।
আপনি এই জাতীয় পদ্ধতিগুলিকে সুরক্ষিত করার জন্য নিজেকে আরও এবং আরও কোড যুক্ত করে দেখতে পাবেন এবং এটিকে বিল্টিন হিসাবে তৈরি করা যথেষ্ট সহজ।
যে কোনও বিষয় কার্যকর করার যোগ্য এটি এটিকে বিল্টিন হওয়া থেকে বাধা দেয় না। বিন্দু ক্ষেত্রে:
echo
এবং test
echo
এবং test
POSIX- আদেশযুক্ত ইউটিলিটিগুলি ( /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
কমান্ডটি ব্যবহার করার পরামর্শ দেওয়া হয়েছে