为什么 PATH 有这些目录的想法

为什么 PATH 有这些目录的想法

在我的 .profile 中,我PATH="$HOME/.local/lib:$HOME/.local/bin:$HOME/.node_modules/bin:$HOME/.cargo/bin:$HOME/local/bin:/usr/bin:$PATH" 在 .zshrc 中,有 miniconda 路径内容(export PATH="/home/user/miniconda3/bin:$PATH"),但我删除了它,它似乎是最后一个加载的,所以我不这样做我认为这不是问题所在。但是,在我的 shell 中,我得到以下内容

/sbin:/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/opt/cuda/bin:/opt/cuda/nsight_compute:/opt/cuda/nsight_systems/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/var/lib/snapd/snap/bin

也许某些 arch 包设置了这些路径?但是在我的路径中设置 sbin 是什么?我不是根。

另外,我的 .profile 中的 PATH 命令没有被拾取,我已经尝试过导出和不导出。我很确定它曾经有效。 (编辑:似乎 zsh 仅来源 .zprofile)

答案1

奇怪的是lib目录。拥有sbin是很正常的,因为在过去的几年里,越来越多的 Linux 发行版已经将sbin目录符号创建为相应的bin目录。例如,在我的 Arch 上:

$ ls -ld /sbin /usr/sbin
lrwxrwxrwx 1 root root 7 Jan 31 20:51 /sbin -> usr/bin
lrwxrwxrwx 1 root root 3 Jan 31 20:51 /usr/sbin -> bin

这在Arch 文档:

Arch Linux 遵循操作系统的文件系统层次结构,使用系统服务经理。看文件层次结构(7)有关每个目录及其名称的说明。特别是,/bin/sbin、 和/usr/sbin是到 的符号链接/usr/bin,并且/lib/lib64是到 的符号链接/usr/lib

通过使s 符号链接到相应的s 来合并bin和目录变得越来越常见。 freedesktop.org 的人们对此进行了论证sbinsbinbin这里,我在下面转载了他们的一些主要论点:

兼容性:要点

  • 行为上与其他 Unix/Linux 的兼容性得到改善:/usr合并后,所有二进制文件在 和 中均可用,分别在 和 中均可用/bin/usr/bin只是/sbin因为变成/usr/sbin/bin 的符号链接/usr/bin,分别变成了 的符号链接)。这意味着为其他 Unix 或其他 Linux 编写并移植到您的发行版的脚本/程序将不再需要修复所调用二进制文件的文件系统路径,否则这将是令人沮丧的主要原因。和(分别和)变得完全等同。/sbin/usr/sbin/usr/bin/bin/usr/sbin/sbin
  • 改进了与其他 Unix(特别是 Solaris)外观的兼容性:目前主要的商业 Unix 实现是 Oracle Solaris。 Solaris 已经/usr在 Solaris 11 中完成了相同的合并。通过在 Linux 中进行相同的更改,我们最大限度地减少了与主要 Unix 实现的差异,从而简化了 Solaris 的可移植性。
  • 改进了与 GNU 构建系统的兼容性:Linux 软件的最大部分是使用 GNU autoconf/automake(即 GNU autotools)构建的,它们不知道 Linux 特定的/usr划分。维护/usr拆分需要在上游构建系统和发行版的包中进行重要的特定于项目的处理。通过/usr合并,这项工作变得不必要,并且将包移植到 Linux 变得更加简单。
  • 改进了与当前上游开发的兼容性:为了最大限度地减少 Linux 发行版与上游开发之间的差异,/usr合并是关键。

[。 。 .]

超越兼容性

/usr 合并的一个主要好处是降低了系统的复杂性:新的文件系统层次结构变得更加简单,并且(只读,甚至可能不可变)供应商提供的操作系统资源和用户资源之间的分离变得更加清晰。由于层次结构复杂性降低,打包也变得更加简单,因为处理 .spec 文件中的拆分问题消失了。

合并的目录 /usr 几乎包含了供应商提供的全部操作系统资源,为我们提供了许多有关操作系统快照的新功能以及用于网络共享或在一台主机上运行多个来宾的企业环境选项。供应商提供的静态操作系统资源在单个位置被垄断,可以轻松地将其设置为只读,无论是针对整个系统还是针对每个服务单独设置。在当前跨多个目录的任意工具分割的情况下,大部分工作都很难完成,甚至是不可能的。

通过将所有供应商提供的操作系统资源放在单个目录 /usr 中,它们可以原子地共享,它们的快照成为原子的,并且文件系统可以作为单个单元设置为只读。

至于在您的 中设置它们的内容PATH,在 的情况下/usr/local/sbin,由默认文件添加/etc/profile

$ grep sbin /etc/profile
append_path '/usr/local/sbin'

我找不到添加位置/sbin/usr/sbin添加位置,这很奇怪。我能想到的任何可能设置它们的文件中似乎都没有提到它们。我在我的系统上创建了一个新用户bib2,该用户具有以下路径:

$ echo $PATH 
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin:/usr/local/bin

然而,除了 之外/usr/local/sbin,其他sbin目录并没有在明显的地方提到:

$ grep -HR sbin ~/.bashrc ~/.profile ~/.bash_profile \
       ~/bash.login ~/.bash_aliases /etc/bash.bashrc /etc/profile \
        /etc/profile.d/ /etc/environment /etc/security/pam_env.conf \
        /etc/login.defs 2>/dev/null 
/etc/profile:append_path '/usr/local/sbin'
/etc/login.defs:ENV_SUPATH  PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
/etc/login.defs:ENV_PATH    PATH=/usr/local/sbin:/usr/local/bin:/usr/bin
/etc/login.defs:#USERDEL_CMD    /usr/sbin/userdel_local

所以这些必须在其他地方定义,但我找不到在哪里。

相关内容