अभी एक बेवकूफ की तरह लग रहा है। यह काम क्यों नहीं करता है?
echo "/some/directory/path" | xargs -n1 cd
अभी एक बेवकूफ की तरह लग रहा है। यह काम क्यों नहीं करता है?
echo "/some/directory/path" | xargs -n1 cd
जवाबों:
पाइप एक उपप्रकार में xargs चलाता है, और xargs एक उपप्रकार में सीडी चलाता है। एक उपप्रकार में परिवर्तन मूल प्रक्रिया के लिए प्रचारित नहीं किया जाता है।
cd `echo "/some/directory/path" | cut -d\ -f1`
(ध्यान दें कि मैंने रिक्त स्थान पर विभाजित करने के लिए to कट ’को जोड़ा और पहला आइटम जिस तरह से xargs करता है) को पकड़ो
xargs
नहीं चल सकता cd
है, एक शेल बिल्डिन है और xargs
केवल फ्री-स्टैंडिंग निष्पादनयोग्य चला सकता है। हालाँकि आपने जो कहा है वह सबप्रोसेस के बारे में सच है।
cd `port file libcudd | sed -e 's/\/Portfile//'`
(आमतौर पर लंबे लोग जिन्हें आप मैन्युअल रूप से हैंडल नहीं करना चाहते हैं, जैसे कि MacPorts Portfile लोकेशन)।
आदेश cd
एक अंतर्निहित है, क्योंकि वर्तमान निर्देशिका के बारे में जानकारी एक प्रक्रिया से जुड़ी है और केवल शेल-इन अंतर्निहित रनिंग शेल की वर्तमान निर्देशिका को बदल सकती है।
आपके कोड में दो समस्याएं हैं:
xargs
नहीं चल सकता cd
क्योंकि cd
एक अंतर्निहित कमांड है औरxargs
केवल निष्पादन योग्य फ़ाइलें चला सकता है।cd
से बुलाए गए उप-प्रक्रिया में भाग लेते हैं xargs
, तो इसका मूल प्रक्रिया पर कोई प्रभाव नहीं पड़ेगा जैसा कि ऊपर बताया गया है।समाधान एक उप-शेल चलाने के लिए है, इसके अंदर चलता है cd
और फिर आप नई वर्तमान निर्देशिका में कमांड निष्पादित कर सकते हैं।
ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
ls | xargs ...
इस उदाहरण में करने के लिए समझ में नहीं आता है । इसके लिए मान में पास होना चाहिए $0
, जैसेecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'