我怀疑您的.bash_profile
or.bashrc
正在添加
到您的 PATH 中,并且在 shell 启动期间调用.rbenv/shims
之前的某个时间点正在运行
。path_helper
path_helper 的手册页打开:
The path_helper utility reads the contents of the files in the directo-
ries /etc/paths.d and /etc/manpaths.d and appends their contents to the
PATH and MANPATH environment variables respectively.
这里的关键点是 path_helper 实用程序旨在将内容添加到现有PATH
设置,而不是替换它们。(实际上,它真正做的是预先添加内容,而不是附加它们,这对PATH
变量很重要......)
因此,如果我从 my 上的条目开始PATH
,由 path_helper 生成的设置将确保该条目在PATH
它生成的位置上继续。
% echo $SHELL
/bin/bash
% uname
Darwin
% /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin"; export PATH;
% PATH="" /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin"; export PATH;
% PATH=foo /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:foo"; export PATH;
请注意,foo
我的 PATH 中的最后一行已经包含在内,尽管 和 的内容/etc/paths
并/etc/paths.d/*
没有改变。
同时,path_helper 实用程序似乎也小心不要产生具有重复条目的路径;它在连接/etc/paths
and/etc/paths.d/*
和当前
PATH
.
后一个细节可能特别令人困惑,因为与原始PATH
设置(!)相比,它可能导致条目重新排序。
以下是此行为的一些示例: 第一种情况显示重复foo
被删除。第二种和第三种情况说明了条目重新排序:在两种情况下生成的 PATH 相同,但在第三种情况下,/usr/bin
条目已从中间foo
移动bar
到PATH
. (这种重复条目删除似乎仅基于条目对上的简单字符串匹配,如下面的第四种情况所示,字符串/usr/bin/
保持在foo/
和之间bar
。)
% PATH=foo:foo /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:foo"; export PATH;
% PATH=foo:bar /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:foo:bar"; export PATH;
% PATH=foo:/usr/bin:bar /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:foo:bar"; export PATH;
% PATH=foo/:/usr/bin/:bar /usr/libexec/path_helper
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:foo/:/usr/bin/:bar"; export PATH;
最后,在应得的地方给予赞扬:虽然上面的所有命令序列都是我自己调查的结果,但我最初是在阅读此处path_helper
的注释后受到启发来研究的行为,其中指出重用环境变量集由父进程。path_helper
PATH