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


17

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

这些是设置路径的唯一位置吗?我希望对此有更好的理解。

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

在该文件中,我完全看不到PATHvar。在.profile主目录的文件中,有以下行:

PATH="$HOME/bin:$PATH"

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

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

Answers:


20

有很多地方PATH可以设置。

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

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

然后,大多数登录方式(但不是cron作业)执行登录外壳程序,该外壳程序读取系统范围和每个用户的配置文件。这些文件可以修改的值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,但这取决于显示管理器,桌面环境或其他会话启动脚本以及每个发行版如何设置它们。


4

初始PATH变量通常是在中设置的。/etc/profile 有时,系统管理员也会将PATH变量放到/etc/profile.d

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

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

对于壳特定登录,路径可以被定义在~/.bash_profile~/.bashrc.cshrc,或类似的。如果用户想要特定外壳的特定路径,或者恰好在其中保留所有个人喜好,则可以在此处设置PATH。

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

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


我刚刚检查了您提到的所有这些文件,但是〜/ .bash_profile和.cshrc不存在。/etc/profile.d目录中的3个脚本文件:appmenu-qt5.sh,bash_completion.sh和vte.sh也不设置PATH变量。二进制/ bin / bash程序中设置的默认PATH是“ shell也具有环境变量”是什么意思?当我在终端回显$ PATH时,我得到:/ usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin:/ usr / games:/ usr / local / games但我不知道所有设置都在哪里。
Larry Lawless 2015年

我想我有点误解了您的问题,我想您正在询问可以设置PATH的所有位置,但是我认为您对PATH的初始设置更感兴趣。为此,请看/etc/bashrc。这确定了BASH的启动方式,其中应包括所有初始环境变量。在我的系统上,/etc/bashrc读取为,/etc/profile.d但听起来您只有3个文件,/etc/profile.d因此您的发行版可能以不同的方式进行操作。
Klaatu von Schlacker 2015年

1
我基本上想知道它的来龙去脉。我希望肯·汤普森(Ken Thompson)是我的父亲:)
拉里·劳瑞斯

你会到达那里。相信我,每天使用一段时间后,所有这些都会开始出现,只要您不断问“为什么?” 阅读文档以获取答案,您最终会学到很多东西!
Klaatu von Schlacker 2015年

在Linux Mint 18 Cinnamon中,请确保检查/etc/profile.d/jdk_home.sh,并将此文件重命名为jdk_home.sh.old,现在我的路径不再被覆盖,可以调用java -version并看到Java 9预期。即使我在update-aternatives --config java中正确选择了Java 9,该jdk_home.sh文件仍覆盖$ PATH
flyingdrifter

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构建二进制文件时选择了此默认值,这取决于所使用的OS /发行版。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.