![CentOS 7 上的 bash PATH 从哪里获取 /usr/local/bin?](https://linux22.com/image/699224/CentOS%207%20%E4%B8%8A%E7%9A%84%20bash%20PATH%20%E4%BB%8E%E5%93%AA%E9%87%8C%E8%8E%B7%E5%8F%96%20%2Fusr%2Flocal%2Fbin%EF%BC%9F.png)
我刚刚使用 centos/7 框和 Vagrant 启动了一个全新的 CentOS 7 VM(bash 版本 4.2.46),当我以 vagrant 用户身份登录时,这是我的 PATH:
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin
以 root 身份登录时,PATH 如下:
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
我知道这/etc/profile
是添加/usr/local/sbin:/usr/sbin
(对于大多数用户来说是在末尾,对于 root 来说是在开始),并且/etc/skel/.bash_profile
最终在 vagrant 主目录中的是添加/home/vagrant/.local/bin:/home/vagrant/bin
,但是初始设置来自哪里?
目前我无法解释为什么用户最终得到了/usr/local/bin:/usr/bin
他们的 PATH,而 root 得到了其他的。
(坦率地说,根 PATH 的顺序看起来很奇怪,因为根据 ,/usr/local/sbin
和/usr/sbin
应该在最后/etc/profile
。)
答案1
在 bash 源“config-top.h”中有以下内容:
/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE
#define DEFAULT_PATH_VALUE \
"/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
#endif
/* The value for PATH when invoking `command -p'. This is only used when
the Posix.2 confstr () function, or CS_PATH define are not present. */
#ifndef STANDARD_UTILS_PATH
#define STANDARD_UTILS_PATH \
"/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/etc"
#endif
答案2
其他人在 CentOS 错误跟踪器上问过同样的问题。我找到的最早的帖子是这个。
/usr/local/bin 在 /bin/bash 中被硬编码。
- https://bugs.centos.org/view.php?id=10200
- https://bugs.centos.org/view.php?id=10199
- https://bugs.centos.org/view.php?id=10198
- https://bugs.centos.org/view.php?id=7492
如您所见,该问题于 2012 年 5 月首次报告,并且存在于 CentOS 6 和 CentOS 7 中。
因此,尽管这可能令人困惑,但看起来您的分析是正确的,即路径不是来自 /etc/profile。路径来自 /bin/bash。
答案3
它看起来确实被硬编码到/bin/bash
strings /bin/bash | grep "\/usr\/local\/bin"
/usr/local/bin:/bin:/usr/bin
这似乎是默认的 PATH。
答案4
我今天遇到了这个问题(在我的情况下它不在 PATH 中),我意识到这只会发生在登录 shell 中。如果你以其他用户身份运行 shell,/usr/local/bin
则不会添加到路径中(例如su <username>
)。也许这就是 vagrant 发生的情况