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,但这取决于显示管理器、桌面环境或其他会话启动脚本,以及每个发行版如何设置这些。
初始 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。
添加到其他答案:
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构建二进制文件时选择的,这取决于所使用的操作系统/发行版。