Lar*_*ess 23 path environment-variables
我已经在几个地方读过PATH
设置/etc/profile
或.profile
主目录中的文件。
这些是路径设置的唯一地方吗?我想更好地理解它。
在/etc/profile
文件中,如以下注释所述"system-wide .profile file for the Bourne shell"
。这是否意味着配置文件是 bash 的主要配置文件?
在那个文件中,我根本没有看到PATH
var 被设置。在.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。
添加到其他答案:
bash
PATH
如果环境中未设置,则将设置为硬编码的默认值。在 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
构建二进制文件时选择的,这取决于所使用的操作系统/发行版。
归档时间: |
|
查看次数: |
45720 次 |
最近记录: |