在我的 .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
但是我尝试将其复制到我的 .zshrc 和
$PATH
没有被设置。首先我把
echo
“如果目录存在”函数中的语句,我发现 if 语句的评估结果为假,即使对于明显存在的目录也是如此。然后我删除了目录存在检查和
$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
没有找到或执行底部目录中的程序。
我究竟做错了什么?
最佳答案
与其他 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
因为您可能不会引用
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))
N
glob qualifier仅选择存在的匹配项。添加 -/
到限定符列表(即 (-/N)
或 (N-/)
),如果您担心其中一个元素可能不是目录或指向某个目录的符号链接(symbolic link)(例如损坏的符号链接(symbolic link))。 ^
parameter expansion flag确保 glob 限定符分别应用于每个数组元素。您也可以使用
N
限定符仅在元素存在时添加元素。请注意,您需要进行通配,所以 path+=/usr/local/mysql/bin(N)
行不通。path+=(/usr/local/bin/mysql/bin(N-/))
关于zsh - 如何在 ZSH 中编辑路径变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9347478/