CentOS 7 上的 bash PATH 从哪里获取 /usr/local/bin?

CentOS 7 上的 bash PATH 从哪里获取 /usr/local/bin?

我刚刚使用 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 中被硬编码。

  1. https://bugs.centos.org/view.php?id=10200
  2. https://bugs.centos.org/view.php?id=10199
  3. https://bugs.centos.org/view.php?id=10198
  4. 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 发生的情况

相关内容