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

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

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

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

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

在该文件中我PATH根本没有看到 var 被设置。在主目录的文件中.profile有这一行:

PATH="$HOME/bin:$PATH"

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

PATH有经验的人可以对这个变量给出广泛而详细的解释吗?谢谢!

答案1

PATH可以设置的地方有很多。

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

在系统上使用聚丙烯酰胺,具体来说pam_env模块,环境变量可以在系统范围文件/etc/environment和每个用户文件中设置~/.pam_environment

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

答案2

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

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

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

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

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

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

答案3

添加到其他答案:

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

$ env -i bash -c 'echo $PATH'
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

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

$ strings /bin/bash | grep /usr/sbin
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.

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

$ env -i bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/bin

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

答案4

https://askubuntu.com/questions/705912/where-is-my-path-variable-being-set

^^ 这对我有帮助。尝试 grep 'PATH=' 或 'export PATH=' 而不是实际目录来查看它的设置位置

相关内容