gpt4 book ai didi

zsh - 如何在 ZSH 中编辑路径变量

转载 作者:行者123 更新时间:2023-12-03 11:32:51 27 4
gpt4 key购买 nike

在我的 .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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com