如果我这样做,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 不重复。