2012-02-19 11 views
21

में पथ वैरिएबल संपादित करने के लिए मेरी मैं .bash_profile है निम्नलिखित लाइनों में:कैसे ZSH

PATHDIRS=" 
/usr/local/mysql/bin 
/usr/local/share/python 
/opt/local/bin 
/opt/local/sbin 
$HOME/bin" 
for dir in $PATHDIRS 
do 
    if [ -d $dir ]; then 
     export PATH=$PATH:$dir 
    fi 
done 

हालांकि मैं अपने .zshrc को यह कॉपी करने की कोशिश की, और $PATH सेट नहीं की जा रही है।

सबसे पहले मैंने "अगर निर्देशिका मौजूद है" फ़ंक्शन के अंदर echo कथन डाले और मैंने पाया कि यदि कथन कथन का मूल्यांकन कर रहा था, यहां तक ​​कि स्पष्ट रूप से मौजूद निर्देशिकाओं के लिए भी।

तब मैं निर्देशिका-मौजूद जाँच हटाया, और $PATH इस तरह गलत तरीके से सेट किया जा रहा था:

/usr/bin:/bin:/usr/sbin:/sbin: 
/usr/local/bin 
/opt/local/bin 
/opt/local/sbin 
/Volumes/Xshare/kburke/bin 
/usr/local/Cellar/ruby/1.9.2-p290/bin 
/Users/kevin/.gem/ruby/1.8/bin 
/Users/kevin/bin 

नीचे निर्देशिका में कार्यक्रमों की कोई नहीं मिला या मार डाला जा रहा था।
मैं क्या गलत कर रहा हूँ?

उत्तर

48

अन्य गोले के विपरीत, zsh शब्द बंटवारे प्रदर्शन नहीं करता या चर प्रतिस्थापन के बाद ग्लोबिंग। इस प्रकार $PATHDIRS वैरिएबल के बिल्कुल वैल्यू वाले एक स्ट्रिंग तक फैलता है, न कि स्ट्रिंग्स की एक सूची में, जिसमें प्रत्येक अलग व्हाइटस्पेस-मूल्य के सीमित टुकड़े होते हैं।

एक सरणी का उपयोग करना इसे व्यक्त करने का सबसे अच्छा तरीका है (न केवल zsh में, बल्कि ksh और bash में)।

pathdirs=(
    /usr/local/mysql/bin 
    … 
    ~/bin 
) 
for dir in $pathdirs; do 
    if [ -d $dir ]; then 
     path+=$dir 
    fi 
done 

के बाद से आप शायद बाद में pathdirs का उल्लेख करने के लिए नहीं जा रहे हैं, क्या आप इसे भी इनलाइन में लिख सकते हैं: सभी निर्देशिकाओं आप की तरह जोड़ें:

for dir in \ 
    /usr/local/mysql/bin \ 
    … \ 
    ~/bin 
; do 
    if [[ -d $dir ]]; then path+=$dir; fi 
done 

व्यक्त करने के लिए यह और भी एक छोटा रास्ता नहीं है path सरणी पर, फिर मौजूद मौजूद विकल्पों का चयन करें।

path+=/usr/local/mysql/bin 
… 
path=($^path(N)) 

Nglob qualifier केवल मैचों है कि मौजूद चयन करता है। क्वालीफायर सूची में -/ जोड़ें (यानी (-/N) या (N-/)) यदि आप चिंतित हैं कि तत्वों में से कोई एक निर्देशिका या अन्य के लिए एक प्रतीकात्मक लिंक हो सकता है (उदा। टूटा सिमलिंक)। ^parameter expansion flag यह सुनिश्चित करता है कि ग्लोब क्वालीफायर प्रत्येक सरणी तत्व पर अलग-अलग लागू होता है।

आप केवल N क्वालीफायर का उपयोग कर सकते हैं ताकि तत्व मौजूद हो। ध्यान दें कि आपको ग्लोबिंग होने की आवश्यकता है, इसलिए path+=/usr/local/mysql/bin(N) काम नहीं करेगा।

path+=(/usr/local/bin/mysql/bin(N-/)) 
+9

+1 - 'zsh' में '$ PATH' हेरफेर के लिए उपयोगी दो अतिरिक्त त्वरित युक्तियां (* द्वारा पारित किसी के लिए): * (1) * संलग्न करने के बजाय प्रीपेड करने के लिए: 'पथ [1,0] =/पथ/to/dir', और * (2) * यदि आप dirs को खोजने के लिए globbing का उपयोग कर रहे हैं, तो आपको लूप का उपयोग करने की आवश्यकता नहीं है और इसके बजाय बस 'पथ + = ($ PWD/node_modules/**/bin ') (* (1) * के साथ भी काम करता है)। – unthought

+0

धन्यवाद, मैंने पथ = ($^पथ (एन- /)) के साथ आपके सुझाव का उपयोग किया। अब यह सुनिश्चित करने का कोई तरीका है कि प्रत्येक बार जब मैं स्रोत चलाता हूं तो प्रत्येक डीआईआर $ PATH में डुप्लिकेट नहीं करता है ~/.zshrc? धन्यवाद – stansult

+2

@stansult [क्या मेरे पैथ में एक निर्देशिका को केवल zsh में जोड़ने का कोई तरीका है यदि यह पहले से मौजूद नहीं है?] (Http://unix.stackexchange.com/questions/62579/is-there-a-way- to-add-a-directory-to-my-path-in-zsh-only-if-its-not-already-pre) – Gilles

2

अभी भी यह सुनिश्चित नहीं है कि समस्या क्या थी (शायद $ PATHDIRS में न्यूलाइन)? लेकिन zsh सारणी वाक्य-विन्यास के लिए बदल रहा यह तय:

PATHDIRS=(
/usr/local/mysql/bin 
/usr/local/share/python 
/usr/local/scala/scala-2.8.0.final/bin 
/opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin 
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin 
/opt/local/etc 
/opt/local/bin 
/opt/local/sbin 
$HOME/.gem/ruby/1.8/bin 
$HOME/bin) 

और

path=($path $dir) 
5

आप अपने .zshrc में

setopt shwordsplit 

डाल सकते हैं। फिर zsh सभी बोर्न शैल की तरह विश्व विभाजन कर देगा।यह डिफ़ॉल्ट noshwordsplit प्रतीत होता है एक गलतफहमी है जो कई सिर खरोंच का कारण बनती है। मुझे आश्चर्य होगा अगर यह एक एफएक्यू नहीं था। चलो देखते हैं ... yup: http://zsh.sourceforge.net/FAQ/zshfaq03.html#l18 3.1: क्यों $ var जहां var = "foo bar" मैं अपेक्षा करता हूं?

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