设置 zsh PATH 不产生所需的顺序

Mar*_*ols 6 homebrew zsh path zshrc

我在 Mac OS X 10.8.3 上使用 Homebrew。Homebrew 希望/usr/local/bin路径中的目录早于/usr/bin,否则将使用系统提供的程序而不是 Homebrew 管理的替换程序。

我正在使用 zsh,并在我中.zshenv重置 PATH,然后使用 path_helper 来初始化它,如下所示:

if [ -x /usr/libexec/path_helper ]; then
  PATH=''
  eval `/usr/libexec/path_helper -s`
fi
Run Code Online (Sandbox Code Playgroud)

紧接着,也在 中.zshenv,我将其添加/usr/local/bin到 PATH 之前。

export PATH="/usr/local/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

$PATH 中还添加了各种其他内容。RVM,/usr/local/sbin以及我的个人bin目录:

export PATH=$HOME/.rvm/bin :$PATH
...
export PATH=$PATH:/usr/local/sbin:$HOME/bin
Run Code Online (Sandbox Code Playgroud)

最后,我用来typeset -u从路径中删除任何重复项(尽管它们来自哪里对我来说是个谜)。

typeset -U PATH 
Run Code Online (Sandbox Code Playgroud)

毕竟这就是我的路径:

/Users/mark/.rvm/gems/ruby-1.9.3-p374/bin
/Users/mark/.rvm/gems/ruby-1.9.3-p374@global/bin
/Users/mark/.rvm/rubies/ruby-1.9.3-p374/bin
/Users/mark/.rvm/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
/usr/local/sbin
/Users/mark/bin
Run Code Online (Sandbox Code Playgroud)

我知道/etc/paths设置这些路径:

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
Run Code Online (Sandbox Code Playgroud)

所以我编辑了该文件并删除了/usr/local/bin' option so that the only place it is being set is in.zshenv`。

所有这些都包含在我的 GitHub 上的点文件存储库 ( https://github.com/zan5hin/dotfiles ) 中,并且正在两台笔记本电脑上使用。在第一台笔记本电脑上,路径是正确的,/usr/local/bin紧随 RVM 条目。在第二台笔记本电脑上,它的显示如我上面详述的那样。

当 zsh 配置是相同的副本时,我无法解释为什么第二台机器上的路径不正确。

谁能建议为什么路径会出现故障?

谢谢。

Joa*_*anc 6

zsh 按以下顺序读取文件(来自man 1 zsh

  1. $ZDOTDIR/.zshenv
  2. /etc/zprofile(如果登录)
  3. $ZDOTDIR/.zprofile(如果登录)
  4. /etc/zshrc(如果是互动的话)
  5. $ZDOTDIR/.zshrc(如果是互动的话)
  6. /etc/zlogin(如果登录)
  7. $ZDOTDIR/.zlogin(如果登录)

如果 ZDOTDIR 未设置,则使用 HOME。上面列出的 /etc 中的文件可能位于另一个目录中,具体取决于安装。

您的更改是 (2) 之前的 (1);(2) 的 macOS 默认值是:

% cat /etc/zprofile
# System-wide profile for interactive zsh(1) login shells.

# Setup user specific overrides for this in ~/.zprofile. See zshbuiltins(1)
# and zshoptions(1) for more details.

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi
Run Code Online (Sandbox Code Playgroud)

因此,您的更改将被 macOS 默认值覆盖。您需要稍后在管道中更改 PATH 以保持顺序。


Bar*_*mar 0

这行是错误的:

export PATH=$HOME/.rvm/bin :$PATH
Run Code Online (Sandbox Code Playgroud)

它应该是:

export PATH=$HOME/.rvm/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

前面的空格:$PATH会导致您丢失 之前的内容$PATH