अभी एक बेवकूफ की तरह लग रहा है। यह काम क्यों नहीं करता है?
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'