我在 OSX 上的 iterm2 中使用 zsh 5.0.8 版本。
我启动计算机并printenv
显示$PATH
变量:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin
根据我的理解,zsh 将按顺序获取以下文件:
/etc/zshenv
~/.zshenv
/etc/zshrc
~/.zshrc
我查了一下,我没有前3个文件,而且我的.zshrc
基本上是空的,与$PATH变量没有任何关系。
那么变量集在哪里$PATH
???
答案1
我今天确实刚刚与这个问题进行了斗争。
在 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;
就其本身而言,这不会执行任何操作,但它是从我的机器上调用的/etc/zprofile
:
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
这可能会因您的计算机而异,因为 Apple 似乎在不同版本的 OS X 中稍微移动了此代码。
这是列表全部ZSH 在 OS X 中读取的文件,按照它们的评估顺序:
- /etc/zshenv
- 〜/.zshenv
- /etc/zprofile
- 〜/.zprofile
- /etc/zshrc
- 〜/.zshrc
- /etc/zlogin
- 〜/.zlogin
- 〜/.zlogout
- /etc/zlogout
其中一些文件在某些情况下不会被评估,例如作为非交互式 shell 脚本运行时,但我不打算在这里讨论。如果您有兴趣,可以在 ZSH 手册页中找到。
$ man zsh
值得注意的/etc/zprofile
是运行后 ~/.zshenv
,所以如果您遵循 ZSH 指南并在 .zshenv 中设置$PATH
,它可能会被path_helper
.如果您遇到此问题,可能值得重命名/etc/zprofile
,以便尽早设置/etc/zshenv
系统。$PATH
答案2
这是指,但我怀疑也bash
适用于。zsh
默认值为小路
bash
是在编译时确定的。它没有在启动文件中设置,尽管可能会在启动文件中进行修改。
Fedora 和 Red Hat Enterprise Linux 实用指南:第七版。 p359。
编辑
我做了一些更多的挖掘,发现默认值PATH
实际上是在编译期间设置的,可以在初始化程序文件。
/* Set default path */ path = (char **) zalloc(sizeof(*path) * 5); path[0] = ztrdup("/bin"); path[1] = ztrdup("/usr/bin"); path[2] = ztrdup("/usr/ucb"); path[3] = ztrdup("/usr/local/bin"); path[4] = NULL;
编辑2:
我进入 freenode 上的 zsh IRC,开发人员能够给我一个包含四个不同命令的列表,这些命令都表明 PATH 是在编译中设置的。我在扩展聊天中发布了这些命令,但没有意识到它们会在 X 时间后丢失。如果您想亲自看看,请要求 IRC 中的开发人员进行演示。