अंतर्निहित कमांड cd और cd के बीच क्या अंतर है?


17

मैं, एक लिनक्स कमांड का सामना करना पड़ा builtin cd

आज्ञाओं builtin cdऔर के बीच अंतर क्या है cd?

वास्तव में, मैंने अंतर के बारे में कुछ शोध किए, लेकिन मुझे इस बारे में एक उल्लेखनीय और महत्वपूर्ण स्पष्टीकरण नहीं मिला।



इसे भी देखें: stackoverflow.com/q/15691977/974555
gerrit

जवाबों:


41

cdआदेश, एक अंतर्निहित है, इसलिए सामान्य रूप से builtin cdके रूप में ही काम करेंगे cd। लेकिन cdफ़ंक्शन या उपनाम के रूप में पुनर्परिभाषित किए जाने पर एक अंतर होता है, जिस स्थिति cdमें फ़ंक्शन / उपनाम को कॉल करेगा लेकिन builtin cdफिर भी निर्देशिका को बदल देगा (दूसरे शब्दों में, फ़ंक्शन द्वारा clobbered होने पर भी अंतर्निहित सुलभ रखेगा।)

उदाहरण के लिए:

user:~$ cd () { echo "I won't let you change directories"; }
user:~$ cd mysubdir
I won't let you change directories
user:~$ builtin cd mysubdir
user:~/mysubdir$ unset -f cd  # undefine function

या एक उपनाम के साथ:

user:~$ alias cd='echo Trying to cd to'
user:~$ cd mysubdir
Trying to cd to mysubdir
user:~$ builtin cd mysubdir
user:~/mysubdir$ unalias cd  # undefine alias

का उपयोग करना builtinभी एक cdफ़ंक्शन को परिभाषित करने का एक अच्छा तरीका है जो कुछ करता है और निर्देशिका को बदलता है (क्योंकि cdइसे कॉल करने से बस एक अंतहीन पुनरावृत्ति में फ़ंक्शन को कॉल करना जारी रहेगा।)

उदाहरण के लिए:

user:~ $ cd () { echo "Changing directory to ${1-home}"; builtin cd "$@"; }
user:~ $ cd mysubdir
Changing directory to mysubdir
user:~/mysubdir $ cd
Changing directory to home
user:~ $ unset -f cd  # undefine function

5
+1 उदाहरण यहाँ विशेष रूप से सचित्र हैं।
तशस

2
एक उपनाम के मामले में, क्या कोई अंतर है builtin cd mysubdirऔर \cd mysubdir?
जेरिट

2
@gerrit केवल अगर कोई फ़ंक्शन नाम है cd, जो मामले \cdमें उपनाम को बायपास करेगा और फ़ंक्शन को चलाएगा। देखें stackoverflow.com/a/16506263/4518341
wjandrea

15

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

bashआदेश builtinबलों खोल उपयोग करने के लिए निर्मित एक आदेश के संस्करण है, भले ही वहाँ एक खोल समारोह, उपनाम, या बाहरी कमांड ही नाम के साथ उपलब्ध हो सकता है।

इस मामले में जहां वहाँ में है नाम के साथ एक खोल समारोह जैसे cd, तो builtin cdहैं नहीं कि कहते हैं। का उपयोग करना builtin cdहै कि एक खोल समारोह या उपयोगकर्ता द्वारा उर्फ के माध्यम से जोड़ा गया हो सकता है किसी भी अतिभारित कार्यक्षमता बाइपास।

उदाहरण:

cdबिल्ट-इन कमांड एक समारोह है कि शीघ्र अद्यतन करता है के द्वारा ओवरलोड हो गया है:

cd() {
    builtin cd "$@" && PS1=$(__update_prompt)
}

जहां __update_promptकुछ अन्य उपयोगकर्ता-आपूर्ति फ़ंक्शन है जो एक स्ट्रिंग को आउटपुट करता है।

builtin cdसमारोह में समारोह रिकर्सिवली फोन नहीं होता। builtin cdएक शेल में उपयोग करना जहां यह फ़ंक्शन सक्रिय है, इसके अतिरिक्त फ़ंक्शन को कॉल नहीं करेगा।


1 एक बाहरी cdकमांड ( macOS और, मेरा मानना ​​है, सोलारिस) के साथ यूनीस हैं । उस कमांड का उद्देश्य, जो शेल के लिए कार्य निर्देशिका को बदल नहीं सकता है, संभवतः POSIX मानक को संतुष्ट करने के लिए है, जो cdकि उपलब्ध होने वाली बाहरी उपयोगिताओं में से एक के रूप में सूचीबद्ध करता है ( cdजो "विशेष अंतर्निहित उपयोगिताओं" में से एक नहीं है) । यह देखने के लिए एक परीक्षण के रूप में भी काम कर सकता है कि किसी दिए गए निर्देशिका के लिए कार्य निर्देशिका बदलना संभव है या नहीं


एफडब्ल्यूआईडब्ल्यू, मैकओएस भी बाहरी cdकमान के साथ ओएस की श्रेणी में आते हैं ।
योना

@ योआन वास्तव में यह करता है।
Kusalananda

धन्यवाद - आपने मेरा दिन शीर्ष पायदान के साथ बनाया है, अच्छी तरह से शोध किया है, फुटनोट पेडेंट्री।
जेम्स

अधिकांश गोले - यह निष्पादन के लिए एक बाहरी कार्यक्रम है, लेकिन फिर यह cd तब अपने शेष तर्कों को निष्पादित करेगा
Grump
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.