बिलियन कमांड और जो नहीं है, उसमें क्या अंतर है?


72

क्या एक अंतर्निहित कमांड और किसी अन्य कमांड के बीच कोई आंतरिक अंतर है जो नाममात्र एक ही काम कर सकता है?

जैसे। क्या बिल्डिंस को "विशेष" संधि मिलती है? ... वहाँ उन्हें कम उपरि चल रहा है? .. या वे सिर्फ 'में निर्मित' हैं; अपनी कार के डैशबोर्ड की तरह?

... और क्या इन बिल्डरों की कोई निश्चित (वर्तमान) सूची है?

जवाबों:


90

आपकी टिप्पणियों से, आप वास्तव में एक खोल के बारे में भ्रमित होने लगते हैं । कर्नेल सिस्टम के प्रबंधन के लिए जिम्मेदार है। यह वह हिस्सा है जो वास्तव में प्रोग्राम लोड करता है और चलाता है, फाइलों तक पहुंचता है, मेमोरी आवंटित करता है, आदि। लेकिन कर्नेल का कोई उपयोगकर्ता इंटरफ़ेस नहीं है; आप केवल एक मध्यस्थ के रूप में दूसरे कार्यक्रम का उपयोग करके इसके साथ संवाद कर सकते हैं।

शेल एक प्रोग्राम है जो एक प्रॉम्प्ट को प्रिंट करता है, आप से इनपुट की एक पंक्ति को पढ़ता है, और फिर फ़ाइलों को हेरफेर करने या अन्य प्रोग्राम चलाने के लिए इसे एक या अधिक कमांड के रूप में व्याख्या करता है। जीयूआई के आविष्कार से पहले, शेल एक ओएस का प्राथमिक उपयोगकर्ता इंटरफ़ेस था। एमएस-डॉस पर, शेल को बुलाया गया था command.comऔर कुछ लोगों ने कभी एक अलग का उपयोग करने की कोशिश की। हालांकि, यूनिक्स पर लंबे समय से कई गोले हैं, जिन्हें उपयोगकर्ता चुन सकते हैं।

इन्हें 3 प्रकारों में विभाजित किया जा सकता है। बोर्न-संगत गोले मूल बॉर्न शेल से प्राप्त सिंटैक्स का उपयोग करते हैं । C शैल मूल C शेल से सिंटैक्स का उपयोग करते हैं । फिर ऐसे अनौपचारिक गोले हैं जो अपने स्वयं के सिंटैक्स का आविष्कार करते हैं, या किसी प्रोग्रामिंग भाषा से एक उधार लेते हैं, और आम तौर पर पहले दो प्रकारों की तुलना में बहुत कम लोकप्रिय होते हैं।

बिल्ट-इन कमांड केवल एक कमांड है जिसे शेल स्वयं लोड करता है, बजाय इसके कि वह किसी अन्य प्रोग्राम को लोड करने और चलाने के अनुरोध के रूप में व्याख्या करता है। इसके दो मुख्य प्रभाव हैं। सबसे पहले, यह आमतौर पर तेज़ होता है, क्योंकि किसी प्रोग्राम को लोड करने और चलाने में समय लगता है। बेशक, कमांड को चलाने में जितना अधिक समय लगता है, लोड रन समय की तुलना समग्र रन समय की तुलना में होती है (क्योंकि लोड समय काफी कम होता है)।

दूसरे, एक अंतर्निहित कमांड शेल की आंतरिक स्थिति को प्रभावित कर सकती है। इसीलिए जैसे कमांड का निर्माण किया cd जाना चाहिए, क्योंकि एक बाहरी प्रोग्राम शेल की वर्तमान निर्देशिका को बदल नहीं सकता है। अन्य आदेश, जैसे echo, दक्षता के लिए अंतर्निहित हो सकते हैं, लेकिन कोई आंतरिक कारण नहीं है कि वे बाहरी आदेश नहीं हो सकते हैं।

कौन-सी कमांड अंतर्निहित हैं, यह उस शेल पर निर्भर करता है जिसका आप उपयोग कर रहे हैं। आपको एक सूची के लिए इसके प्रलेखन से परामर्श करना होगा (जैसे, bashअंतर्निहित कमांड इसके मैनुअल के अध्याय 4 में सूचीबद्ध हैं )। typeयदि एक आदेश में निर्मित (यदि आपके खोल POSIX संगत है) आदेश आप बता सकते हैं, क्योंकि POSIX कि आवश्यकता है typeएक अंतर्निहित हो। यदि whichआपके शेल में बिल्ट-इन नहीं है, तो शायद यह आपके शेल के बिल्ट-इन के बारे में नहीं जानता होगा, लेकिन सिर्फ बाहरी कार्यक्रमों के लिए देखेगा।


अनुप्रयोग वास्तव में इंटरप्ट जारी करके कर्नेल के साथ संवाद करते हैं।
नाथन उस्मान

11
@George: अनुप्रयोग कर्नेल के साथ syscalls जारी करके संवाद करते हैं, जो कि OS और आर्किटेक्चर पर निर्भर करता है या इंटरप्ट का उपयोग नहीं कर सकता है। उपयोगकर्ता, एक नियम के रूप में, हस्तक्षेप नहीं करते हैं।
गिल्स

2
@cjm: जब आप इसे इस तरह समझाते हैं तो यह बहुत आसान लगता है:) ... आपने निश्चित रूप से कोहरे को साफ करने में मदद की है ... बस एक हल्की धुंध अब .. (वास्तव में बस यही है कि मौसम कैसा है यहां, आज सुबह। .. खुशी से मिस्टी;) ... धन्यवाद
पीटर.ओआर

@ गिल्स: वाक़ई? मैंने सोचा कि सभी उपयोगकर्ता मोड प्रोग्रामों को इंटरप्ट के माध्यम से कर्नेल के साथ संचार किया जाता है (निश्चित आर्किटेक्चर पर, निश्चित रूप से)।
नाथन उस्मान

2
@ cjm बहुत गहन और शिक्षाप्रद उत्तर। मैंने इसे पढ़कर बहुत कुछ सीखा। :)
अनकुश

37

निर्मित उपयोगिताओं के तीन स्तर हैं:

  • कुछ उपयोगिताओं वास्तव में एक प्रोग्रामिंग भाषा के रूप में शेल का हिस्सा हैं, भले ही वे आरक्षित शब्द नहीं हैं । वे नियंत्रण प्रवाह उपयोगिताओं (हैं ., :, break, continue, return, trap, exit, exec, eval), पैरामीटर से संबंधित उपयोगिताओं ( set, unset, shift, export, readonly, local¹, typeset¹), उर्फ उपयोगिताओं ( alias², unalias²) और times³। इन विशेष बिल्ट-इन का विशेष उपचार मिलता है:

    • यदि आप एक विशेष बिल्ट-इन में गलत तर्क पास करते हैं, तो शेल त्रुटि संदेश प्रदर्शित करने के बाद केवल अगले कमांड को छोड़ देने के बजाय शेल को निरस्त कर सकता है।
    • पूर्व-असाइनमेंट सिंटैक्स foo=bar utilityका एक अलग अर्थ है: यह foo=bar; utilityकेवल उपयोगिता की अवधि के लिए पर्यावरण को असाइन करने के बजाय एक साधारण पैरामीटर असाइनमेंट (यानी के बराबर ) है।
  • कुछ उपयोगिताओं को शेल के अंदर लागू करने की आवश्यकता होती है क्योंकि वे शेल की आंतरिक सेटिंग्स पर कार्य करते हैं। यह भी शामिल है:

    • उपयोगिताओं है कि इस तरह के रूप में खोल के वर्तमान निर्देशिका पर कार्रवाई cd, dirs, pushd, popd,
    • जैसे काम पर नियंत्रण उपयोगिताओं bg, disown, fg, jobs, wait,
    • उपयोगिताओं कि पढ़ने के लिए या इस तरह के रूप में अन्य खोल विशेषताओं में हेरफेर builtin, command, hash, read, type, ulimit, umask,
    • जैसे इंटरैक्टिव सुविधाओं, जब वे उपस्थित कर रहे हैं, से संबंधित उपयोगिताओं fc, history, bind
  • कुछ उपयोगिताओं आम तौर पर विशुद्ध रूप से के लिए बनाया-इन के रूप में लागू किया जाता है प्रदर्शन : echo, printf, test, true, false

जैसे उन्नत गोले बैश , ksh और zsh आम तौर पर अक्सर गैर मानक सुविधाओं को लागू करने (आमतौर पर बातचीत के लिए) और अधिक का निर्माण-इन नहीं हैं,। प्रत्येक शेल का मैनुअल आपको बताएगा कि क्या कमांड अंतर्निहित हैं, हालांकि कुछ शेल ( zsh , कम से कम) गतिशील रूप से लोड करने योग्य मॉड्यूल का समर्थन करते हैं जो अधिक अंतर्निहित इन्स प्रदान कर सकते हैं।

¹ POSIX के लिए अज्ञात, लेकिन ksh और कई अन्य गोले में विशेष।
IX POSIX में साधारण, लेकिन ksh और कई अन्य गोले में विशेष।
³ में ksh, कीवर्ड के timesआसपास एक आवरण है time: यह एक उपनाम है { { time;} 2>&1;}। ध्यान दें कि POSIX timeसाधारण पार्सिंग या एक कीवर्ड के साथ एक बाहरी उपयोगिता होने की अनुमति देता है जो एक पूरी पाइपलाइन पर लागू होता है (जो कि यह ksh में है, zsh में bash)।


3
ये भेद वास्तव में महत्वपूर्ण हैं।
dmckee

त्वरित प्रश्न, तो जब हम करते हैं तो "साधारण पैरामीटर असाइनमेंट" का क्या अर्थ है while IFS= read -r line?
सर्गी कोलोडियाज़नी

@SergiyKolodyazhnyy readएक विशेष अंतर्निहित नहीं है, इसलिए IFS=readकेवल कमांड की अवधि के लिए चर सेट करता है।
गिल्स

10

एक बिलिन एक कमांड है जिसे शेल द्वारा प्रदान किया जाता है, बजाय एक बाहरी कार्यक्रम के। यहाँ bash's buildins की सूची दी गई है (वे bash मैन पेज में भी सूचीबद्ध हैं) और zsh' s buildins 'kshचलाकर सूची प्रदान करता है builtin

यह जानने के लिए कि क्या कोई विशेष कमांड बिल्टिन है, आप चला सकते हैं type command। कोशिश करो type forऔर type lsयह देखने के लिए।


typeचाल करने के लिए लगता है; उस के लिए धन्यवाद ... लेकिन मुझे अभी भी आश्चर्य है कि "शेल द्वारा प्रदान" का अर्थ क्या है ... शायद मुझे और अधिक पूरी तरह से समझने की आवश्यकता है कि शेल कर्नेल से कैसे संबंधित है .... लेकिन 2 बजे नहीं .. मैं आऊंगा। इस पर कल वापस
पीटर।

1

प्रत्येक डिस्ट्रो और शेल में कमांड बनाम बिलिन शेल फ़ंक्शन का एक अलग संग्रह होता है। आम तौर पर विचार यह है कि गोले सबसे आम और सरल कार्यों में समय, गति को बचाने के लिए निर्माण करते हैं, और उनके बाकी फीचर सेट के साथ एकीकृत होंगे। ओवरहेड बहुत कम है, क्योंकि इसे किसी अन्य सिस्टम प्रक्रिया को लॉन्च करने की आवश्यकता नहीं है। हालांकि मिश्रण और मैच करना संभव है। आप एक शेल चला सकते हैं जिसमें किसी चीज़ के लिए एक बिल्डिन है, लेकिन आपके सिस्टम पर भी वह कमांड है। आमतौर पर बिलिन प्राथमिकता लेता है, लेकिन आप इसे नियंत्रित कर सकते हैं।

आप आसानी से पता लगा सकते हैं कि एक विशिष्ट कमांड एक बिलिन है या नहीं type mycommand। अधिकांश शेल मैन पेजों में उनके निर्माण की सूची भी है।

संपादित करें:type यह पता लगाने के लिए उपयोग करें कि क्या कमांड एक बिलिन है, और यदि यह नहीं whichसीखना है कि इसे कहां से निष्पादित किया जाएगा।


@ कालेब: आपकी टिप्पणी के लिए धन्यवाद, लेकिन यह मुझे आश्चर्यचकित करता है कि वास्तव में एक "प्रणाली प्रक्रिया" क्या है .. मैं तब तक संदर्भ देखता रहता हूं, लेकिन मुझे समझ नहीं आता कि भेद कहाँ है .... (btw मैं नहीं कर सकता देखें कि 'कौन सा' एक निरपेक्ष संकेतक है) .. उदा .. 'जो प्रतिध्वनि =>"/bin/echo" and टाइप करता है echo =>"echo is a shell builtin", but 'which dd=> "/ bin / dd" और type dd=> "dd is / bin / dd" ... so, I part part there ....
पीटर।

"सिस्टम की खरीद" का अर्थ है कि इसे कर्नेल द्वारा प्रबंधित एक स्वतंत्र अनुप्रयोग के रूप में शुरू किया जा रहा है। बिलिंस के मामले में विकल्प सिर्फ आपके शेल के पहले से चल रहे कोड में एक उप-फ़ंक्शन चला रहा है। आपके द्वारा दिए गए उदाहरण में, typeक्या चलाया जा रहा है , इसका बेहतर संकेतक है, लेकिन आप नोटिस करते हैं echoकि दोनों एक बिलिन हैं और उस नाम के साथ एक आवेदन है। यदि आपके शेल में बिलिन नहीं है, तो सिस्टम रन हो जाएगा।
कालेब

2
whichजरूरी नहीं कि एक अंतर्निहित कमांड हो, और यदि यह नहीं है, तो यह शेल के बिल्ट-इन के बारे में पता नहीं चलेगा। POSIX के लिए जरूरी है कि typeएक बिल्ट-इन कमांड हो, इसलिए यह हमेशा बिल्ट-इन के बारे में जानता है।
cjm

के उपनाम के साथ कई सिस्टम जहाज whichकरने के लिए typeया विकल्पों जैसे के कुछ सेट alias which='type -path'- इस भ्रम का स्रोत हो सकता है।
रैंडम 832

1
जब तक whichइसे बदल नहीं दिया जाता , तब तक मैं इसे बढ़ा नहीं सकता type। मैं इस्तेमाल करता था, जो बार-बार, नहीं जानता typeथा और बहुत आलस करने के लिए चकित था, whichयह केवल सही है, अगर कार्यक्रमों के बीच निर्णय लेना।
उपयोगकर्ता अज्ञात
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.