如何在ZSH中编辑路径变量

Kev*_*rke 22 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
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)

  • +1 - 对于`zsh`中的`$ PATH`操作有两个额外的快速提示(对于任何路过的人):*(1)*以prepend而不是append:`path [1,0] =/path/to/dir `,和*(2)*如果你使用globbing来找到dirs,你不必使用for循环而只需要`path + =($ PWD/node_modules/**/bin`)(也适用于*(1)*). (9认同)
  • @stansult [有没有办法在zsh中将目录添加到我的PATH中,只有它不存在?](http://unix.stackexchange.com/questions/62579/is-there-a-way-to-add -a目录到我的路径,在-的zsh-仅-IF-它 - 不已经预) (2认同)

Jen*_*ens 5

你可以放

 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"不能达到我的预期?