Macos 为什么在shell登录后$PATH会被覆盖?
关于如何在Mac OS X/Linux环境中更改路径,这里似乎有上百个问题……问题是,我认为实际上知道如何更改我的path变量,但似乎是某种原因导致它被覆盖。我正在使用zsh,并试图让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
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.