`Cd` एक्सटर्नल कमांड का क्या मतलब है?


71

जैसा कि इस ठीक उत्तर में संदर्भित किया गया है , पोसिक्स सिस्टम cdमें शेल बिलिन के अतिरिक्त एक बाहरी बाइनरी है। OS X 10.8 पर /usr/bin/cd। आप इसे बिलिन की तरह उपयोग नहीं कर सकते cdक्योंकि यह अपनी कार्यशील निर्देशिका को बदलने के तुरंत बाद बाहर निकल जाता है। इससे कौन सा उद्देश्य पूरा होगा?


ध्यान दें कि उबंटू और सेंटोस (और इसलिए संभवतः रेड हैट) में /usr/bin/cdकेवल शेल-इन-शेल ही नहीं है ।
कीथ थॉम्पसन

1
मेरे फेडोरा 19 में /bin/cdहालांकि शामिल हैं ।
स्लम

1
डेबियन (मैंने वर्तमान परीक्षण सहित कई रिलीज़ की जाँच की) न तो है /bin/cdऔर न ही /usr/bin/cd
derobert

1
मुझे लगता है कि इन प्रणालियों को POSIX सख्ती से नहीं करता है। सिर्फ दूसरों की तरह। :)
कोजिरो

जवाबों:


64

यह मुख्य रूप से यह सुनिश्चित करने के रूप में कार्य करता है कि POSIX उपकरण-छाती एक शेल के अंदर और बाहर दोनों उपलब्ध है ( उन की आवश्यकता के लिए POSIX औचित्य देखें )।

इसके लिए cd, यह बहुत उपयोगी नहीं है, लेकिन ध्यान दें कि cdनिर्देशिकाओं को बदलता है, लेकिन अन्य दुष्प्रभाव हैं: यह एक निकास स्थिति देता है जो यह निर्धारित करने में मदद करता है कि आप chdir()उस निर्देशिका में सक्षम हैं या नहीं, और एक उपयोगी त्रुटि संदेश को यह बताते हुए आउटपुट करता है कि आप क्यों नहीं कर सकते। chdir()जब आप नहीं कर सकते।

उदाहरण:

dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)

एक अन्य संभावित दुष्परिणाम एक निर्देशिका का स्वचालित होना है।

कुछ सिस्टमों पर, मानक शेल बिल्डरों के लिए अधिकांश बाहरी कमांड उसी स्क्रिप्ट के सिम्कलिन के रूप में कार्यान्वित किए जाते हैं:

#! /bin/sh -
"${0##*/}" "$@"

यह एक शेल शुरू कर रहा है और इसमें बिलिन चला रहा है।

कुछ अन्य प्रणालियाँ (जैसे कि GNU) में सही निष्पादन योग्य कमांड के रूप में उपयोगिताओं हैं, जो शेल बिलिन संस्करण से भिन्न होने पर भ्रम पैदा कर सकती हैं।


2
साइड इफेक्ट्स और एरर मैसेज के बारे में अवलोकन के लिए +1। यह हमेशा नए उपयोगकर्ताओं को अच्छी तरह से नहीं समझाया गया है कि यूनिक्स में बहुत सारे चतुर मुहावरे साइड इफेक्ट्स के सावधानीपूर्वक उपयोग से आते हैं। और आदमी के पन्ने खुद बड़ी तस्वीर बताने में कभी अच्छे नहीं रहे।
RBerteig

एसओ पर इसी तरह के प्रश्न से यहाँ आया था, क्या आप विस्तार से कह सकते हैं कि जब आप कहते हैं "एक निर्देशिका का ऑटोमेशन"?
विरोध


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

11

तथ्य यह है एक गैर builtin सीडी आदेश उपलब्ध है अनिवार्य रूप से POSIX की वजह से है आवश्यकता सभी नियमित builtins कार्यकारी परिवार आदेशों द्वारा प्रतिदेय होने के लिए env, find, nice, nohup, timeऔर xargsतथ्य यह है इन आदेशों में से कुछ के लिए खुद को builtins के रूप में लागू नहीं किया जा रहा करने के लिए संयुक्त।

cdहालांकि यह बहुत समझ में नहीं आता क्योंकि इन कमांड के साथ इसे जोड़ना काफी व्यर्थ है। हालांकि अधिक या कम दस उदाहरण हैं:

find . -type d -exec cd {} \;
env HOME=/foo cd

2
बिल्ट-इन की एक संख्या वास्तव में उस नियम से छूट दी गई है । विचित्र रूप से, सीडी उनमें से एक नहीं है।
केविन

5
@ केविन मैंने लिखा है यह सभी नियमित बिल्डरों के लिए एक आवश्यकता है , छूट वाले व्यक्ति विशेष निर्मित हैं : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsetबाहरी आदेशों के रूप में अप्रासंगिक होंगे जबकि cdएक नियमित बिल्डिन है जिसमें कमांड के रूप में कुछ प्रलेखित उपयोग के मामले हैं।
जुलियाग्रे

1

यह जाँचने के लिए कि क्या कोई पथ किसी सुलभ निर्देशिका से मेल खाता है, cdनिष्पादन योग्य प्रक्रिया का उपयोग करेगा और CDPATHचर का उपयोग करेगा , और यदि वह सफलतापूर्वक उपयोग किया गया था, तो हल की गई निर्देशिका के पूर्ण पथ को प्रिंट करेगा

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

यह केवल कभी-कभी उपयोगी होता है, लेकिन मिलान निर्देशिकाओं की खोज के लिए उसी तर्क को फिर से लागू करने से बचाएगा। एक ठोस उपयोग का मामला कई संभावित माता-पिता के तहत एक विशेष नाम की पहली मौजूदा निर्देशिका पा रहा है।

cdके लिए भी प्रक्रिया OLDPWDहै cd -, लेकिन यह बहुत कम उपयोगी है क्योंकि पर्यावरण चर पहले से ही उपलब्ध होगा।

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