bash - किस कमांड से cd पर परिणाम कैसे पाइप करें


87

मैं एक whichकमांड से परिणाम को कैसे पाइप कर सकता हूं cd?

यही मैं करने की कोशिश कर रहा हूँ:

which oracle | cd
cd < which oracle

लेकिन उनमें से कोई भी काम नहीं करता है।

क्या इसे प्राप्त करने का एक तरीका है (कॉपी / पेस्ट के बजाय)?

संपादित करें: दूसरे विचार पर, यह आदेश विफल हो जाएगा, क्योंकि गंतव्य फ़ाइल एक फ़ोल्डर / निर्देशिका नहीं है

इसलिए मैं सोच रहा हूं कि अब ट्रेलिंग "/ ओरेकल" भाग से छुटकारा पाने के लिए एक बेहतर तरीका काम कर रहा है (sed या awk, या यहां तक ​​कि पर्ल) :)

संपादित करें: ठीक है, जो मुझे अंत में मिला है:

cd `which oracle | sed 's/\/oracle//g'`

2
जो आपको कमांड देता है, डायरेक्टरी नहीं
Anycorn

क्या आप निर्देशिका प्राप्त करने की कोशिश कर रहे हैं जहां कार्यक्रम स्थापित है? dirname, basename ?
aycorn

@aaa: आप सही हैं, मुझे लगता है कि dirname बेहतर है क्योंकि यह "वास्तविक dir" को इंगित करता है न कि ओरेकल एक्ज़ीक्यूटेबल के लिए एक प्रतीकात्मक लिंक ... जिसके कारण मेरा sed apporach फेल हो जाएगा :)
माइकल माओ

जवाबों:


129

आप उन मामलों में पाइप का उपयोग करते हैं जहां कमांड मानक इनपुट से मापदंडों की अपेक्षा करता है। ( इस पर अधिक )।

cdकमान के साथ ऐसा नहीं है। निर्देशिका कमांड तर्क है। ऐसे मामले में, आप कमांड प्रतिस्थापन का उपयोग कर सकते हैं। Backticks का प्रयोग करें या $(...)कमांड का मूल्यांकन करने के लिए, इसे वेरिएबल में स्टोर करें।

path=`which oracle`
echo $path # just for debug
cd $path

हालाँकि इसे बहुत सरल तरीके से किया जा सकता है:

cd `which oracle` 

या यदि आपके पथ में विशेष वर्ण हैं

cd "`which oracle`"

या

cd $(which oracle)

जो बैकटिक नोटेशन के बराबर है, लेकिन यह अनुशंसा की जाती है (बैकस्ट को एपोस्ट्रोफ के साथ भ्रमित किया जा सकता है)

.. लेकिन ऐसा लगता है कि आप चाहते हैं:

cd $(dirname $(which oracle))

(जो आपको दिखाता है कि आप आसानी से घोंसले के शिकार का उपयोग कर सकते हैं)

$(...) (साथ ही बैकटिक्स) दोहरे-उद्धृत स्ट्रिंग्स में भी काम करते हैं, जो तब मदद करता है जब परिणाम में अंततः रिक्त स्थान शामिल हो सकते हैं।

cd "$(dirname "$(which oracle)")"

(ध्यान दें कि दोनों आउटपुट को दोहरे उद्धरण चिह्नों के एक सेट की आवश्यकता होती है।)


ठंडा। क्या आप यहाँ क्या चल रहा है, इसके बारे में थोड़ा बता सकते हैं? यह एक चर की तरह दिखता है; क्या कुछ डिफ़ॉल्ट अस्थायी चर है जहां एक कमांड के परिणाम जाते हैं?
नैट डब्ल्यू।

आह, मैं बैकटिक्स के बारे में संकलन भूल गया :(
माइकल माओ

4
आप उद्धरण का एक और जोड़ी की जरूरत है: cd "$(dirname "$(which oracle)")"
फिलिप

|एक नई प्रक्रिया को खोलता है, तो भले ही cdstdin से पढ़ते हैं, cmd | cdकाम नहीं (यानी मूल प्रक्रिया में वर्तमान निर्देशिका ही रहते हैं) होगा।
काइल स्ट्रैंड

24

निर्देशिका प्राप्त करने के लिए dirname के साथ:

cd $(which oracle | xargs dirname)

संपादित करें: रिक्त स्थान वाले रास्तों से सावधान रहें, नीचे देखें


3
cd "$(which oracle | xargs -0 dirname)"यदि मार्ग में व्हॉट्सएप हो तो उपयोग करें । -0 झंडा व्हॉट्सएप के बजाय शून्य द्वारा इनपुट को विभाजित करता है।
अनीशपेटेल

9
cd `which oracle`

ध्यान दें कि बैकटिक्स हैं (आमतौर पर यूएस कीबोर्ड पर 1 के बाईं ओर की कुंजी)


1
यदि पथ में रिक्त स्थान या अन्य "विशेष" अक्षर हैं, तो यह काम नहीं करता है, और आपको फ़ाइल का नाम बंद करना होगा।
फिलिप

@ पथिप्पल आप इसका उपयोग कर सकते हैं यदि आपके पथ में विशेष वर्ण हैंcd "`which oracle`"
राम पत्र

4

ठीक है, यहाँ एक समाधान है जो सही उद्धरण का उपयोग करता है:

cd "$(dirname "$(which oracle)")"

बैकटिक्स से बचें, वे कम पठनीय हैं, और हमेशा प्रक्रिया प्रतिस्थापन को उद्धृत करते हैं।


2

आपको पाइप की आवश्यकता नहीं है, आप वह कर सकते हैं जो आप बैश पैरामीटर विस्तार का उपयोग करना चाहते हैं!

आगे की नोक: यदि आप बैश का उपयोग कर रहे हैं तो बाहरी "जो" कमांड के बजाय "टाइप -2" का उपयोग करें।

# test
touch /ls
chmod +x /ls
cmd='ls'
PATH=/:$PATH
if cmdpath="$(type -P "$cmd")" && cmdpath="${cmdpath%/*}" ; then
   cd "${cmdpath:-/}" || { echo "Could not cd to: ${cmdpath:-/}"; exit 1; }
else
   echo "No such program in PATH search directories: ${cmd}"
   exit 1
fi

1

अपने संपादित प्रश्न के जवाब में, आप कमांड के नाम का उपयोग कर सकते हैं dirname:

cd $(dirname `which oracle`)

यह काम नहीं करता है यदि पथ में रिक्त स्थान या अन्य "विशेष" अक्षर हैं।
फिलिप

1
आसानी से इसे दोहरे-उद्धरण द्वारा तय किया गया।
डेविड जेड

1

उपरोक्त अच्छे उत्तर के अलावा, एक बात का उल्लेख करने की आवश्यकता है कि सीडी एक शेल बिल्डिन है, जो एलएस जैसी नई प्रक्रिया के अलावा उसी प्रक्रिया में चलती है जो एक कमांड है।

  1. /unix/50022/why-cant-i-redirect-a-path-name-output-from-one-command-to-cd

  2. http://en.wikipedia.org/wiki/Shell_builtin

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