我在 OSX 上的 iterm2 中使用 zsh 5.0.8 版本。
我启动计算机并向printenv
我显示$PATH
变量:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin
Run Code Online (Sandbox Code Playgroud)
根据我的理解,zsh 将按顺序获取以下文件:
/etc/zshenv
~/.zshenv
/etc/zshrc
~/.zshrc
Run Code Online (Sandbox Code Playgroud)
我查了一下,我没有前 3 个文件,我.zshrc
的基本上是空的,与 $PATH 变量无关。
那么$PATH
变量集在哪里???
Ala*_*ird 16
我今天刚刚与这个战斗。
在 OS X 上,Yosemite PATH 以一种相当迂回的方式构建。
我相信,正如 cremefraiche 所说,ZSH 有一个内置的,$PATH
如果没有其他设置,它就会使用它,但这不是你的来源。首先有一个/etc/paths
包含目录列表的文件。还有一个目录,/etc/path.d
其中包含更多包含目录的文件。程序/usr/libexec/path_helper
获取这些目录列表,将它们与现有$PATH
变量(如果有)合并,删除任何重复项,并输出结果,/etc/paths
首先列出目录。
您可以尝试自己运行它,它不会造成任何伤害。这是我的输出:
$ /usr/libexec/path_helper
PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/MacGPG2/bin:/Users/alan/.local/bin:/Users/alan/src/go/bin"; export PATH;
Run Code Online (Sandbox Code Playgroud)
就其本身而言,这不会做任何事情,但它是从我的机器上调用的/etc/zprofile
:
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
Run Code Online (Sandbox Code Playgroud)
这可能因您的机器而异,因为 Apple 似乎在不同版本的 OS X 中稍微移动了此代码。
以下是 ZSH 在 OS X 中读取的所有文件的列表,按照它们的评估顺序:
其中一些文件在某些情况下不会被评估,比如作为非交互式 shell 脚本运行时,但我不打算在这里讨论。如果您有兴趣,可以在 ZSH 手册页中找到它。
$ man zsh
Run Code Online (Sandbox Code Playgroud)
值得注意的是,它/etc/zprofile
是在之后 运行的~/.zshenv
,因此如果您遵循 ZSH 指南并$PATH
在 .zshenv 中设置,它可能会被 .zshenv 破坏path_helper
。如果您遇到这个问题,可能值得重命名,/etc/zprofile
因为/etc/zshenv
系统$PATH
将尽早设置。