PATH 变量在 bash 中的设置位置的完整视图

Lar*_*ess 23 path environment-variables

我已经在几个地方读过PATH设置/etc/profile.profile主目录中的文件。

这些是路径设置的唯一地方吗?我想更好地理解它。

/etc/profile文件中,如以下注释所述"system-wide .profile file for the Bourne shell"。这是否意味着配置文件是 bash 的主要配置文件?

在那个文件中,我根本没有看到PATHvar 被设置。在.profile主目录中的文件中有这一行:

PATH="$HOME/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

这是PATH通过外观重置的,因为它将已经设置的$PATH字符串与$HOME/bin:正确的字符串连接起来?但是,如果etc/profile~/.profile是唯一的文件上设置PATH其中$PATH在该行的代码来了,如果它不定义/etc/profile

有经验的人可以对PATH变量进行广泛而详细的解释吗?谢谢!

Gil*_*il' 26

PATH可以设置的地方很多。

login程序将其设置为默认值。此默认值的配置方式取决于系统。在大多数非嵌入式 Linux 系统上,它取自/etc/login.defs,对于 root 和其他用户具有不同的值。查阅login(1)您系统上的手册以了解它的作用。

在使用PAM 的系统上,特别是pam_env模块,环境变量可以在系统范围的文件/etc/environment和每个用户的文件中设置~/.pam_environment

然后大多数登录方式(但不是 cron 作业)执行一个登录 shell,它读取系统范围和每个用户的配置文件。这些文件可以修改 的值PATH,通常是为了添加条目,但有时以其他方式。读取哪些文件取决于登录 shell 是什么。Bourne/POSIX 风格的 shell 读取/etc/profile~/.profile. Bash 读取/etc/profile,但对于每个用户的文件,它只读取~/.bash_profile~/.bash_login和之间的第一个现有文件~/.profile。岩组读取/etc/zshenv~/.zshenv/etc/zprofile~/.zprofile/etc/zlogin~/.zlogin。许多 GUI 会话安排加载/etc/profile~/.profile,但这取决于显示管理器、桌面环境或其他会话启动脚本,以及每个发行版如何设置这些。


Kla*_*ker 5

初始 PATH 变量通常设置在/etc/profile 有时系统管理员也会将 PATH 变量放入 source/etc/profile.d

这些是默认情况下登录的每个人都会继承的系统 PATH 变量(除非在本地覆盖)。这通常会设置明显的路径,例如/usr/bin,尽管在我的工作中我们/opt广泛使用和一些自定义位置,因此也将它们设置在那里。

在每个用户登录的基础上,PATH 也可以在~/.profile. 这可能定义了并非所有用户都可以访问的内容;也许部门主管可以运行二进制文件,/opt但其他用户不会被这些二进制文件打扰。用户也可以自己修改该文件,好处.profile是它不是特定于 shell 的;如果您登录,则会获取那里设置的 PATH。

对于特定于 shell 的登录,PATH 可以在~/.bash_profile~/.bashrc、 或.cshrc或类似的地方定义。如果用户想要特定 shell 的特定路径,或者他们碰巧在那里保留所有个人偏好,则可以在此处设置 PATH。

总结: /etc/profile 和 /etc/profile.d 是传统的级联设置;它们被继承并通常被添加到个人点文件中(尽管用户可以选择覆盖它们)。个人点文件通常由用户设置。

当然,shell 也有环境变量,所以本地环境变量也可以添加或覆盖任何配置文件中的默认 PATH。


Vla*_*eev 5

添加到其他答案:

bashPATH如果环境中未设置,则将设置为硬编码的默认值。在 Ubuntu Server 16.04.2 机器上,我得到:

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
Run Code Online (Sandbox Code Playgroud)

我们可以使用以下实用程序检查该值是否确实是硬编码的,并且不是从环境或某些文件中读取的strings

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
Run Code Online (Sandbox Code Playgroud)

然而,我在 Arch Linux 机器上得到了不同的结果:

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin
Run Code Online (Sandbox Code Playgroud)

因此,看起来这个默认值是在bash构建二进制文件时选择的,这取决于所使用的操作系统/发行版。