मैं एक कमांड से "cd" पथ नाम आउटपुट को पुनर्निर्देशित क्यों नहीं कर सकता?


27

मैं cdएक निर्देशिका नाम को स्वीकार करने की कोशिश कर रहा हूं जो इसे दूसरे आदेश से पुनर्निर्देशित करता है। इन विधियों में से कोई भी काम नहीं करता है:

$ echo $HOME | cd
$ echo $HOME | xargs cd

यह काम करता है:

$ cd $(echo $HOME)

आदेशों का पहला सेट काम क्यों नहीं करता है, और क्या ऐसे अन्य लोग भी हैं जो इस तरह से असफल होते हैं?


दूसरों द्वारा आप cd का उपयोग करने के लिए अन्य आदेशों या अन्य तरीकों का उल्लेख कर रहे हैं जो इस तरह से विफल हो जाते हैं?
दीदी कोहेन

@DavidKohen मैं अन्य कमांडों का उल्लेख करता हूं
झोनथन

कुछ उल्लेखनीय उदाहरण ulimit, umask, popd, pushd, set, export और read हैं।
दीदी कोहेन

जवाबों:


32

cdएक बाहरी कमांड नहीं है - यह एक शेल बिलिन फ़ंक्शन है। यह वर्तमान शेल के संदर्भ में चलता है, न कि, जैसा कि बाहरी कमांड करते हैं, कांटे / निष्पादित संदर्भ को एक अलग प्रक्रिया के रूप में करते हैं।

आपका तीसरा उदाहरण काम करता है, क्योंकि शेल cd, बेसिन को कॉल करने से पहले चर और कमांड प्रतिस्थापन का विस्तार cdकरता है , ताकि ${HOME}इसके तर्क के रूप में मान प्राप्त हो ।

POSIX सिस्टम करना एक द्विआधारी है cd- मेरी FreeBSD मशीन पर, यह है /usr/bin/cd, लेकिन यह आप क्या सोचते हैं नहीं करता है। बाइनरी को कॉल करने cdसे शेल को बाइनरी को फोर्क / निष्पादित करने का कारण बनता है, जो वास्तव में आपके काम करने की निर्देशिका को आपके द्वारा पारित नाम में बदल देता है। हालाँकि, जैसे ही यह ऐसा होता है, बाइनरी बाहर निकल जाती है, और कांटा / निष्पादित प्रक्रिया गायब हो जाती है, जो आपको आपके शेल में लौटा देती है, जो आपके द्वारा शुरू करने से पहले निर्देशिका में अभी भी है।


10
जो एक आश्चर्यचकित करता है कि बाहरी cdकमांड का क्या मतलब है ?
कोजीरो

23

cdमानक इनपुट नहीं पढ़ता है। यही कारण है कि आपका पहला उदाहरण काम नहीं करता है।

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


4

मौजूदा अच्छे उत्तर के अलावा, यह भी ध्यान देने योग्य है कि एक पाइप एक नई प्रक्रिया की तलाश करता है, जिसकी अपनी अलग कार्यशील निर्देशिका होती है। इसलिए, ऐसा करने की कोशिश करने से काम नहीं चलेगा:

echo test | cd /

इस प्रकार, इस कमांड से शेल के वापस आने के बाद आप / फोल्डर में नहीं होंगे।


पाइपलाइन में सभी कमांड विभिन्न प्रक्रियाओं में चलती हैं, इसलिए a | b, भले ही aऔर bबिल्टिन हो, कम से कम एक तो शेल प्रक्रिया में नहीं चलती है, लेकिन इसकी कोई गारंटी नहीं है कि यह कौन सा है। उदाहरण के लिए एटी एंड टी में ksh, zshया bash -O lastpipe, bवर्तमान शेल प्रक्रिया में चलाया जाता है, इसलिए आपका कोड आपको / वहां ले जाएगा।
स्टीफन चेज़लस

4

सही जवाब के अलावा पहले से ही दिया: आप पार्टी चलाने के लिए और चाहते हैं यह पता लगाने क्या एक सीडी की तरह "कमांड" है आप उपयोग कर सकते हैं प्रकार

$ type cd
cd is a shell builtin

या क्यों नहीं:

$ type time
time is a shell keyword

उदाहरण के लिए, ग्नू समय आमतौर पर आपके पसंदीदा वितरण में शामिल होता है:

$ which time
/usr/bin/time

ओके ओके आप विचार प्राप्त करते हैं, फिर बिल्ली क्या है?

$ type type
type is a shell builtin

यहां बैश मैनुअल स्निपेट दिया गया है:

       type [-aftpP] name [name ...]
          With no options, indicate how each name would be interpreted  if  used  as  a
          command name.  If the -t option is used, type prints a string which is one of
          alias, keyword, function, builtin,  or  file  if  name  is  an  alias,  shell
          reserved word, function, builtin, or disk file, respectively.  If the name is
          not found, then nothing is printed, and an exit status of false is  returned.
          If  the -p option is used, type either returns the name of the disk file that
          would be executed if name were specified as a command  name,  or  nothing  if
          ‘‘type  -t  name’’ would not return file.  The -P option forces a PATH search
          for each name, even if ‘‘type -t name’’ would not return file.  If a  command
          is  hashed,  -p  and -P print the hashed value, not necessarily the file that
          appears first in PATH.  If the -a option is used,  type  prints  all  of  the
          places  that  contain  an  executable  named name.  This includes aliases and
          functions, if and only if the -p option is  not  also  used.   The  table  of
          hashed  commands  is  not  consulted when using -a.  The -f option suppresses
          shell function lookup, as with the command builtin.  type returns true if any
          of the arguments are found, false if none are found.

0

जैसा कि अन्य लोगों ने कहा है, यह काम नहीं करेगा क्योंकि cdशेल बिल्ड कमांड है, बाहरी प्रोग्राम नहीं है, इसलिए इसमें कोई मानक इनपुट नहीं है जिसे आप इसमें पाइप कर सकते हैं।

लेकिन, यहां तक ​​कि अगर यह काम किया है, तो यह वह नहीं होगा जो आप चाहते हैं: एक पाइप एक नई प्रक्रिया पैदा करता है और पहले कमांड के मानक आउटपुट को दूसरे के मानक इनपुट में पुनर्निर्देशित करता है, इस प्रकार केवल नई प्रक्रिया ही इसके वर्तमान कार्य को बदल देती है निर्देशिका; यह किसी भी तरह से पहली प्रक्रिया को प्रभावित नहीं कर सकता है।


2
आपका दूसरा पैराग्राफ सही है। लेकिन पहले पैराग्राफ को फिर से पढ़ें: आप यह क्यों मानते हैं कि शेल बिल्डरों में कोई स्टिंग नहीं है? readआमतौर पर (हमेशा?) एक शेल बिलिन है। यह सच है कि cdस्टड को नजरअंदाज किया जाता है , लेकिन यह एक बिलियन होने के कारण नहीं है।
डबियसजिम

-2

एक अन्य विकल्प बैकटिक्स हैं, जो एक कमांड के दूसरे कमांड के कमांड लाइन तर्क के रूप में एक कमांड के स्टडआउट को जगह देते हैं, और इससे अधिक पोर्टेबल हैं $(...)। उदाहरण के लिए:

cd `echo $HOME`

या अधिक आम तौर पर;

cd `anycommand -and whatever args`

ध्यान दें कि बैकटिक्स का उपयोग कमांड को निष्पादित करने और कमांड लाइन पर आउटपुट को प्रतिस्थापित करने के लिए शेल पर निर्भर करता है। ज्यादातर गोले इसका समर्थन करते हैं।


3
ओपी ने पहले से ही अपने सवाल में कहा है कि यह $(...)काम करता है। मुझे नहीं लगता कि इसके बजाय backticks की सिफारिश करना अच्छी सलाह है, क्योंकि उनके पास बहुत अधिक जटिल नियम हैं और आम तौर पर अधिक त्रुटि-प्रवण हैं। ( बैश संदर्भ नियमावली में Subst3.5.4 "कमांड सब्स्टीट्यूशन" देखें ।)
बरबाद करें

$ () अच्छा है जहाँ समर्थित है, लेकिन विभिन्न गोले और प्रणालियों में बैकटिक्स अधिक व्यापक रूप से समर्थित हैं। लेकिन मुझे इसे "एक और विकल्प" के रूप में फिर से लिखना चाहिए।
सेठ नोबल

अलग-अलग गोले, हाँ; लेकिन अलग "सिस्टम"? क्या वास्तव में कोई गोले हैं जो $(...)एक सिस्टम पर समर्थन करेंगे लेकिन दूसरे पर नहीं ??
रुख

4
-1, यह सवाल का जवाब नहीं देता है।
बर्नहार्ड

3
@ruakh और सेठ: सभी POSIX गोले समर्थन करते हैं $(…)। बिना POSIX शेल (यानी एक वास्तविक बॉर्न शेल के साथ सिस्टम) बहुत पुराना होगा। यहां तक ​​कि सिस्टम जहां /bin/shएक बॉर्न शेल होता है और आपको एक और मार्ग की आवश्यकता होती है जैसे कि /usr/xpg4/bin/shPOSIX शेल प्राप्त करना आजकल दुर्लभ हैं। पेशेवर यूनिक्स बॉक्सन का प्रबंधन न करने वाले किसी भी व्यक्ति को बैकस्टिक्स की सिफारिश करना उन्हें एक असहमति है।
गाइल्स का SO- दुष्ट होना बंद '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.