$PATH 重复问题

$PATH 重复问题

如果我这样做,echo $PATH我会得到以下信息:

/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/usr/local/share/npm/bin:/usr/local/share/python:/opt/X11/bin :/Users/kh/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin

这是在我的 ~/.zshrc 文件中:

导出 PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/usr/local/share/npm/bin:/usr/local/share/python:/opt/ X11/bin:$HOME/.rvm/bin:$PATH

我必须手动添加 /usr/local/etc... 在此文件的前面,因为自制程序正在抱怨。

我已经搜索了所有可能的文件(我知道的)以找到 $PATH 的构建位置。但无济于事。这些都是

~/.bash_profile
~/.bashrc
~/.profile

有什么建议。

答案1

/etc/paths默认路径在macOS 上定义。由于子流程继承环境变量并且您/usr/bin/在您的环境变量中显式设置,$PATH因此您有重复的条目。

要删除重复的条目,您可以使用:

typeset -U PATH

上述命令的结果是只有第一的值中任何给定目录路径的实例$PATH将被保留,而以后的重复项将被自动删除。该效果在当前 shell 会话中持续存在,因此将阻止向变量添加新的重复项。

答案2

我不知道哪个其他文件正在设置您的$PATH但重复的条目是

/opt/X11/bin
/usr/bin
/usr/local/bin
/usr/sbin

所有这些都已设置在您的中~/.zshrc,因此您所需要做的就是不将它们设置在那里。无论如何,这些都应该是默认的$PATH,没有必要添加。大多数系统都默认$PATH包含这些目录,在用户~/.zshrc文件中添加的内容只能添加非标准目录。

将您的$PATH声明更改为

导出 PATH=/usr/local/sbin:/usr/local/share/npm/bin:/usr/local/share/python:$HOME/.rvm/bin:$PATH

答案3

根据ZSH 手册页:

启动/关闭文件

首先从/etc/zshenv读取命令;这不能被覆盖。后续行为由 RCS 和 GLOBAL_RCS 选项修改;前者影响所有启动文件,而第二个仅影响全局启动文件(此处显示的路径以 / 开头)。如果在任何时候未设置其中一个选项,则将不会读取相应类型的任何后续启动文件。 $ZDOTDIR 中的文件也可以重新启用 GLOBAL_RCS。 RCS 和 GLOBAL_RCS 都是默认设置的。

然后从 $ZDOTDIR/.zshenv 读取命令。如果 shell 是登录 shell,则从 /etc/zprofile 读取命令,然后从 $ZDOTDIR/.zprofile 读取命令。然后,如果 shell 是交互式的,则先从 /etc/zshrc 读取命令,然后从 $ZDOTDIR/.zshrc 读取命令。最后,如果 shell 是登录 shell,则读取 /etc/zlogin 和 $ZDOTDIR/.zlogin。

因此,您可能需要检查:

/etc/zshenv
/etc/zshrc
/etc/zlogin

以及他们碰巧获取的任何文件。由于您使用的是 OS X,因此您可能会发现类似以下内容:

if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi

其中,根据path_helper 手册页,还将查看:

/etc/paths
/etc/paths.d/*

答案4

您可以使用以下语法将其他路径设置为 PATH:

PATH=$PATH:/additonally_location

所以我认为 PATH 不重复。

相关内容