ZSH PATH 变量条目在 OS X Catalina 上向后

Gre*_*ond 5 macos zsh path

所以我只安装了 macOS Catalina 和 MacPorts。这导致我不得不修改 .zshenv 文件中的 PATH 和 MANPATH 环境变量,如下所示:

# configure an environment variable for Racket
export RACKET=/Applications/Racket

# configure an appropriate PATH variable for use with MacPorts
export PATH="/opt/local/bin:/opt/local/sbin:$RACKET/bin:$PATH"

# configure an appropriate MANPATH variable for use with MacPorts
export MANPATH="/opt/local/share/man:$RACKET/man:$MANPATH"
Run Code Online (Sandbox Code Playgroud)

但是,运行以下命令echo $PATH使我得到了与预期相反的结果:

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin:/opt/local/sbin:/Applications/Racket/bin
Run Code Online (Sandbox Code Playgroud)

关于我应该做些什么来解决这个问题的任何想法?事实上,对于/opt/local/*我使用的相当多的实用程序,它的全部内容都在最后破坏了一些构建脚本。

yin*_*Liu 6

~/.zshrcor 中添加以下代码~/.zprofile

# Prepend the $PATH
[[ -f $HOME/.zshenv ]] && source $HOME/.zshenv 
# remove duplicate $PATH
typeset -U PATH
Run Code Online (Sandbox Code Playgroud)

解释:

根据zsh 加载顺序,对于zsh中的任何登录 shell,它会etc/zprofile在 after ~/.zshenvbut before调用~/.zshrc,其中包含usr/libexec/path_helper

 # file: etc/zprofile
 # system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
   eval `/usr/libexec/path_helper -s`
fi
Run Code Online (Sandbox Code Playgroud)

上面的代码移动到/usr/bin:/bin:/usr/sbin:/sbin你自己添加的前面,$PATH比如/opt/local/bin:/opt/local/sbin...

再把自己添加的路径加到前面后,.zshenv再重新source/etc/zprofile一下,type -U PATH保留path在第一个出现的地方,去掉重复的。


che*_*ner 4

我怀疑问题是.zshenv在任何其他启动文件之前执行,这些文件也在修改PATH. (这不是完整的解释,/etc/zprofile应该是覆盖PATH,而不是前置。但它很接近。)

不要设置PATH.zshenv它是为所有shell 提供的,无论是否交互式),而是执行它~/.zprofile

man zsh有关获取哪些文件以及何时获取的完整说明,请参阅有关启动/关闭文件的部分。