cdएक POSIX- अनिवार्य शेल बिलिन है:
यदि एक साधारण आदेश में आदेश नाम और तर्कों की एक वैकल्पिक सूची होती है, तो निम्नलिखित क्रियाएं की जाएंगी:
- यदि कमांड नाम में कोई स्लैश नहीं है, तो निम्नलिखित अनुक्रम में पहला सफल कदम होगा:
...
- यदि कमांड नाम निम्न तालिका में सूचीबद्ध उपयोगिता के नाम से मेल खाता है, तो उस उपयोगिता को लागू किया जाएगा।
...
cd
... ...
- अन्यथा, PATH का उपयोग करने के लिए आदेश खोजा जाएगा ...
हालांकि यह स्पष्ट रूप से यह नहीं कहता है कि यह बिल्ट-इन होना है, विवरण में कहा गया हैcd :
चूंकि सीडी वर्तमान शेल निष्पादन वातावरण को प्रभावित करता है, इसलिए इसे हमेशा एक शेल रेगुलर बिल्ट-इन के रूप में प्रदान किया जाता है।
से bashमैनुअल :
निम्नलिखित शेल बिलिन कमांड बॉर्न शेल से विरासत में मिले हैं। ये आदेश POSIX मानक द्वारा निर्दिष्ट के रूप में कार्यान्वित किए जाते हैं।
...
cd
cd [-L|[-P [-e]]] [directory]
मुझे लगता है कि आप एक आर्किटेक्चर के बारे में सोच सकते हैं जहां cdएक बिल्डिन होना जरूरी नहीं है। हालाँकि, आपको यह देखना होगा कि अंतर्निहित अंतर्निहित क्या है। यदि आप कुछ कमांड के लिए कुछ करने के लिए शेल में विशेष कोड लिखते हैं, तो आप बिलिन होने के करीब पहुंच रहे हैं। जितना अधिक आप करते हैं, उतना ही बेहतर है कि बस एक बिल्डिन है।
उदाहरण के लिए, आपके पास शेल उपप्रोसेस के साथ संवाद करने के लिए IPC हो सकता है, और एक cdप्रोग्राम होगा जो निर्देशिका के अस्तित्व की जांच करेगा और क्या आपके पास इसे एक्सेस करने की अनुमति है और फिर इसे बदलने के लिए इसे बताने के लिए शेल के साथ संचार करता है निर्देशिका। हालाँकि, आपको यह देखना होगा कि क्या आपके साथ संवाद करने वाली प्रक्रिया एक बच्चा है (या केवल बच्चों के साथ संचार के विशेष साधन बना सकते हैं, जैसे कि एक विशेष फ़ाइल विवरणक, साझा की गई मेमोरी, आदि) और यदि प्रक्रिया वास्तव में है। विश्वसनीय cdकार्यक्रम या कुछ और चल रहा है। यह कीड़े का एक पूरा कर सकते हैं।
या आपके पास एक cdप्रोग्राम हो सकता है जो chdirसिस्टम को कॉल करता है, और नए शेल पर लागू सभी मौजूदा पर्यावरण चर के साथ एक नया शेल शुरू करता है, और जब किया जाता है तब अपने मूल शेल (किसी तरह) को मारता है। 1
इससे भी बदतर, आपके पास एक प्रणाली भी हो सकती है जहां एक प्रक्रिया अन्य प्रक्रियाओं के वातावरण को बदल सकती है (मुझे लगता है कि तकनीकी रूप से आप डिबगर्स के साथ ऐसा कर सकते हैं)। हालांकि इस तरह की व्यवस्था बहुत, बहुत कमजोर होगी।
आप इस तरह के तरीकों को सुरक्षित करने के लिए अपने आप को अधिक से अधिक कोड जोड़ेंगे, और यह केवल एक बिलियन बनाने के लिए काफी सरल है।
यह एक निष्पादन योग्य है जो इसे एक बिलिन होने से नहीं रोकता है। इसका स्पष्ट उदाहरण:
echo तथा test
echoऔर testPOSIX- अनिवार्य उपयोगिताओं ( /bin/echoऔर /bin/test) हैं। फिर भी लगभग हर लोकप्रिय शेल में एक बिल्डिन echoऔर है test। इसी तरह, killयह भी बनाया गया है कि एक कार्यक्रम के रूप में उपलब्ध है। दूसरों में शामिल हैं:
sleep (सामान्य के रूप में नहीं)
time
false
true
printf
हालाँकि, कुछ मामले ऐसे होते हैं जहाँ एक कमांड कुछ भी नहीं हो सकता है लेकिन एक बिलिन है। उनमें से एक है cd। आमतौर पर, यदि पूर्ण पथ निर्दिष्ट नहीं है, और कमांड का नाम एक बिलिन से मेल खाता है, तो उस कमांड के अनुकूल फ़ंक्शन को कहा जाता है। शेल के आधार पर, बिलिन का व्यवहार और निष्पादन योग्य भिन्न हो सकता है (यह विशेष रूप से एक समस्या हैecho , जिसमें बेतहाशा भिन्न व्यवहार होते हैं । यदि आप व्यवहार के बारे में निश्चित होना चाहते हैं, तो निष्पादन योग्य का उपयोग करके कॉल करना बेहतर है। पूर्ण पथ, और सेट चर जैसे 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 POSIX सिस्टम में एक cdनिष्पादन योग्य है ।
पक्षीय लेख:
यूनिक्स और लिनक्स पर बहुत सारे उत्कृष्ट पोस्ट हैं जो शेल व्यवहार से संबंधित हैं। विशेष रूप से:
यदि आपने अब तक सूचीबद्ध प्रश्नों में एक पैटर्न पर ध्यान नहीं दिया है, तो उनमें से लगभग सभी में स्टीफन चेज़लस शामिल हैं ।
type