शेल में निर्मित कमांड अक्सर प्रदर्शन में वृद्धि के कारण बनाए जाते हैं जो यह देता है। बाहरी कॉलिंग 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
यह है कि इस सूची का हिस्सा नहीं है, लेकिन POSIX निम्नलिखित के बारे में कहता है:
चूंकि cd
मौजूदा शेल निष्पादन पर्यावरण को प्रभावित करता है, इसलिए इसे हमेशा शेल रेगुलर बिल्ट-इन के रूप में प्रदान किया जाता है। यदि इसे एक सबहेल या अलग उपयोगिता निष्पादन पर्यावरण में कहा जाता है, जैसे कि निम्न में से एक:
(cd /tmp)
nohup cd
find . -exec cd {} \;
यह कॉलर के वातावरण की कार्यशील निर्देशिका को प्रभावित नहीं करता है।
इसलिए मैं मान रहा हूं कि "विशेष" बिल्ट-इन में बाहरी समकक्ष नहीं हो सकते, जबकि cd
सिद्धांत में यह हो सकता है (लेकिन यह बहुत ज्यादा नहीं होगा)।