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

Aar*_*hen 9 zsh path

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

  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
Run Code Online (Sandbox Code Playgroud)

值得注意的是,它/etc/zprofile是在之后 运行的~/.zshenv,因此如果您遵循 ZSH 指南并$PATH在 .zshenv 中设置,它可能会被 .zshenv 破坏path_helper。如果您遇到这个问题,可能值得重命名,/etc/zprofile因为/etc/zshenv系统$PATH将尽早设置。

  • 它具体是关于它在 macOS 上的工作方式,因此 Ubuntu 的做法有所不同也就不足为奇了。 (2认同)