2009-05-13 14 views
8

मैं अक्सर निर्देशिका जहां एक विशेष निष्पादन स्थित है को बदलना चाहते स्थित है में बदलने के लिए। तो मुझेएक bash एक लाइनर निर्देशिका जहां कुछ फ़ाइल

cd `which python` 

निर्देशिका में बदलने के लिए कुछ है जो पाइथन कमांड स्थापित है। हालांकि, यह स्पष्ट रूप से अवैध है, क्योंकि सीडी एक निर्देशिका लेता है, फाइल नहीं। जाहिर है कि कुछ regexp-foo मैं फ़ाइल नाम को बंद करने के लिए कर सकता था, लेकिन यह एक आसान लाइनर होने के बिंदु को हरा देगा।

उत्तर

16

यहाँ:

cd $(dirname `which python`) 

संपादित करें:

(इस बार वास्तव में परीक्षण किया)

भी आसान:

function cdfoo() { cd $(dirname `which [email protected]`); } 

फिर "cdfoo अजगर"।

+0

+1 हम योग्य नहीं हैं। –

+0

जब मैं आगे था तो मुझे रोकना चाहिए था ... बोगस उपनाम फ़ॉर्म को हटाने के लिए संपादित किया गया था। –

+0

अच्छा ... एक फ़ंक्शन बनाएं ... + 1 – ojblass

2

कुछ ऐसे ही चाल करना चाहिए:

cd `dirname $(which python)` 
1

आप कुछ इस तरह इस्तेमाल कर सकते हैं:

cd `which <file> | xargs dirname` 
2

एक विशेषता मैं का उपयोग किया है आवंटित pushd/popd है। ये एक निर्देशिका ढेर को बनाए रखते हैं ताकि आप निर्देशिका को बदलने से पहले वर्तमान कार्य निर्देशिका में वापस लौटना चाहते हैं, तो इतिहास के इतिहास को रखने की कोशिश करने की आवश्यकता नहीं है।

उदाहरण के लिए

:

pushd $(dirname `which [email protected]`) 
... 
popd 
8

उन सभी बाहरी प्रोग्राम से बचने के लिए ('dirname' और भी बदतर, बेकार लेकिन लोकप्रिय 'जो') हो सकता है थोड़ा पुनः:

cdfoo() { 
    tgtbin=$(type -P "$1") 
    [[ $? != 0 ]] && { 
    echo "Error: '$1' not found in PATH" >&2 
    return 1 
    } 
    cd "${tgtbin%/*}" 
} 

यह भी ऊपर से असामान्य कीवर्ड 'फ़ंक्शन' को ठीक करता है और त्रुटि (बहुत सरल) त्रुटि हैंडलिंग जोड़ता है।

एक और अधिक sphisticated समाधान के लिए एक शुरुआत हो सकता है।

 
zsh:~% cd =vi(:h) 
zsh:/usr/bin% 

= cmd के लिए विस्तारित:

+0

+1, क्या राहत है, यूनिक्स दुनिया में सैनिटी छोड़ी गई है। – lhunath

0

मैं() सरल त्रुटि हैंडलिंग का एक सा है कि cdfoo के व्यवहार करता है का पालन करें अस्तित्वहीन/nonpath तर्क

function cdfoo() { cd $(dirname $(which $1 || (echo . && echo "Error: '$1' not found" >&2)));} 
3

तुलना के लिए के लिए dirname की है कि जोड़ा सीएमडी और (एच) का मार्ग सिर

zsh लिखने के लिए एक ग्लोब संशोधक है, केवल इतना ही शक्तिशाली है।

+0

कोड के लिए धन्यवाद। वे बकाया हैं! –

संबंधित मुद्दे