如何知道设置 $PATH 环境变量的原因和位置?

如何知道设置 $PATH 环境变量的原因和位置?

我在 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 中读取的文件,按照它们的评估顺序:

  1. /etc/zshenv
  2. 〜/.zshenv
  3. /etc/zprofile
  4. 〜/.zprofile
  5. /etc/zshrc
  6. 〜/.zshrc
  7. /etc/zlogin
  8. 〜/.zlogin
  9. 〜/.zlogout
  10. /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 中的开发人员进行演示。

相关内容