在我的.bash_profile中,我有以下几行:
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
Run Code Online (Sandbox Code Playgroud)
但是我尝试将其复制到我的.zshrc,并且$PATH没有设置.
首先,我将echo语句放在"if directory exists"函数中,我发现if语句的计算结果为false,即使对于明显存在的目录也是如此.
然后我删除了目录存在检查,并且$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
Run Code Online (Sandbox Code Playgroud)
底层目录中的所有程序都没有被找到或执行.
我究竟做错了什么?
Gil*_*il' 48
与其他shell不同,zsh在变量替换后不执行单词拆分或通配.因此,$PATHDIRS扩展为包含变量值的单个字符串,而不是包含每个单独的以空格分隔的值的字符串列表.
使用数组是表达它的最佳方式(不仅在zsh中,而且在ksh和bash中).
pathdirs=(
/usr/local/mysql/bin
…
~/bin
)
for dir in $pathdirs; do
if [ -d $dir ]; then
path+=$dir
fi
done
Run Code Online (Sandbox Code Playgroud)
由于您可能pathdirs以后不打算引用,您可以将其内联编写:
for dir in \
/usr/local/mysql/bin \
… \
~/bin
; do
if [[ -d $dir ]]; then path+=$dir; fi
done
Run Code Online (Sandbox Code Playgroud)
甚至有一种更短的方式来表达这一点:将您喜欢的所有目录添加到path数组中,然后选择存在的目录.
path+=/usr/local/mysql/bin
…
path=($^path(N))
Run Code Online (Sandbox Code Playgroud)
该N 水珠预选赛只选择存在的匹配.如果您担心其中一个元素可能不是目录或符号链接(例如,破坏的符号链接),请添加-/到限定符列表(即(-/N)或(N-/)).的^ 参数扩展标志确保水珠限定符适用于每个数组元素分别.
您也可以使用N限定符仅在元素存在时添加元素.请注意,您需要使用globbing,因此path+=/usr/local/mysql/bin(N)无法正常工作.
path+=(/usr/local/bin/mysql/bin(N-/))
Run Code Online (Sandbox Code Playgroud)
你可以放
setopt shwordsplit
Run Code Online (Sandbox Code Playgroud)
在你的.zshrc.然后zsh将像所有Bourne shell一样执行世界分裂.默认似乎noshwordsplit是一种错误导致许多头部刮伤.如果它不是FAQ,我会感到惊讶.让我们看看...是的:http:
//zsh.sourceforge.net/FAQ/zshfaq03.html#l18
3.1:为什么$ var其中var ="foo bar"不能达到我的预期?
| 归档时间: |
|
| 查看次数: |
24485 次 |
| 最近记录: |