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

标签 zsh

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

相关文章:

macos - iTerm2 右大括号不起作用

zsh - 我可以在 zsh 中同时使用 Emacs 和 Vim 键绑定(bind)吗?

linux - 自定义 bash 完成的提示

linux - 如何在 zshell 中以关键字拆分字符串并保存结果?

shell - ZSH历史完成菜单

ubuntu - 在终结者终端模拟器中运行 Zsh 时修复 .zshrc 中的键设置(Home/End/Insert/Delete)

zsh - 当我用安装的 oh-my-zsh 和 powerlevel9k 主题调整我的 gnome 终端的大小时,我可以看到重绘问题

bash - 自动检测 shell 脚本中可能的参数以完成

shell - 向上箭头键搜索 zsh shell 给出的 2 个单词

vim - 如何在 Ubuntu 中使用 zsh shell 在 vi​​m 中启用系统粘贴?