Macos 为什么在shell登录后$PATH会被覆盖?

Macos 为什么在shell登录后$PATH会被覆盖?,macos,bash,path,homebrew,zsh,Macos,Bash,Path,Homebrew,Zsh,关于如何在Mac OS X/Linux环境中更改路径,这里似乎有上百个问题……问题是,我认为实际上知道如何更改我的path变量,但似乎是某种原因导致它被覆盖。我正在使用zsh,并试图让Brew Doctor不要在user/local/bin之前警告我使用usr/bin。 我的~/.zprofile: export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin echo $PATH 登录时,我得到: Last login: Fri Oct 1

关于如何在Mac OS X/Linux环境中更改路径,这里似乎有上百个问题……问题是,我认为实际上知道如何更改我的path变量,但似乎是某种原因导致它被覆盖。我正在使用zsh,并试图让
Brew Doctor
不要在user/local/bin之前警告我使用usr/bin。 我的~/.zprofile:

export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
echo $PATH
登录时,我得到:

Last login: Fri Oct 17 15:10:30 on ttys000
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
但在登录后运行$PATH时,我得到:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

我直接登录到zsh,但以防万一,my.profile和.bash profile都包含与my.zprofile相同的代码,并且my/etc/path.d目录中没有任何内容。这条路还有别的地方吗?我在这里遗漏了什么?

在您的.zprofile被读取之后,zsh将读取.zshrc和.zlogin(假设是一个登录shell)。您的路径可能会在其中任何一个中重置

通常,路径最好在.zshenv中设置(即使shell不是登录shell,也会读取)。然后不要在任何其他启动文件中设置它。

来自:

用户应该注意/etc/profile设置$PATH变量,该变量将 覆盖~/.zshenv中设置的任何$PATH变量。要防止出现这种情况,请设置 ~/.zshrc中的$PATH变量。(不建议替换默认值 /etc/zsh/zprofile中的一行加上其他内容,会破坏完整性 在/etc/profile.d中提供一些脚本的其他包的名称)

发件人:


如果您使用的是Jet Brains产品(pycharm/goland/webstorm等),您可能会发现其终端上的JB外壳集成正在覆盖
$PATH
。您可以通过取消勾选来禁用它 设置>工具>终端>外壳集成。
有关详细信息,请参见。

导出环境变量只会影响导出过程的子进程。新登录(我假设终端)不是shell的子进程,您只是在其中设置了路径,因此没有设置路径。通常,您不会完全重置个人文件中
path
的值;您只需将目录添加到从系统配置继承的值中。@jrwren设置变量的值会影响当前shell<代码>导出仅导出一个名称,以便子环境继承该值;它不会将值推送到环境中。@chepner这就是我说的:)这意味着导出时对
PATH
的值所做的更改只适用于子进程。那是不对的。啊哈!非常感谢你!我在某个地方读到,只有在交互模式下使用shell(即不作为登录shell)时,才能使用.zshrc。找到导出路径=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin大约在下半部分。解决了这个问题,成功了!获取了关于.zshenv的提示,该提示适用于登录和非登录。绝妙的建议
~/.zshenv
应该是设置路径的理想位置。但是,在OS X和Arch(以及以前的Gentoo)上,在
~/.zshenv
之后执行的系统
/etc/zprofile
将覆盖
路径
变量-因此为了解决这个问题,
路径
MANPATH
设置应该放在后面的一个文件中,例如
~/.zprofile
~/.zshrc
,和
~/.zlogin
。谢谢,@pyrachi,我在拔头发!Pam环境是所有shell选项的公共环境。我想。这真是太令人困惑了,发行版之间也各不相同。但env文件是一条出路。根据我的经验,Zshrc是最糟糕的地方。。。在debian上无论如何都是这样。für bash也一样。更好地使用env文件或pam/etc/zsh/zshenv设置基本路径是一个很好的提示。
For zsh: [Note that zsh seems to read ~/.profile as well, if ~/.zshrc is not present.]

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/zshenv     |    A      |    A      |  A   |
+----------------+-----------+-----------+------+
|~/.zshenv       |    B      |    B      |  B   |
+----------------+-----------+-----------+------+
|/etc/zprofile   |    C      |           |      |
+----------------+-----------+-----------+------+
|~/.zprofile     |    D      |           |      |
+----------------+-----------+-----------+------+
|/etc/zshrc      |    E      |    C      |      |
+----------------+-----------+-----------+------+
|~/.zshrc        |    F      |    D      |      |
+----------------+-----------+-----------+------+
|/etc/zlogin     |    G      |           |      |
+----------------+-----------+-----------+------+
|~/.zlogin       |    H      |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.zlogout      |    I      |           |      |
+----------------+-----------+-----------+------+
|/etc/zlogout    |    J      |           |      |
+----------------+-----------+-----------+------+

Moral:
For bash, put stuff in ~/.bashrc, and make ~/.bash_profile source it.
For zsh, put stuff in ~/.zshrc, which is always executed.