【问题标题】:Trying to understand how the PATH is set on linux (bash on Ubuntu 16.04)试图了解 PATH 是如何在 linux 上设置的(Ubuntu 16.04 上的 bash)
【发布时间】:2020-02-27 01:06:12
【问题描述】:


编辑

我的问题的答案其实很明显,我只是忘记了 EXPORT 关键字的含义。为了以防万一,我还是把解释放在这里了。

简而言之,当使用 Ctrl-Alt T 打开终端时,会创建一个新的 shell,它是登录时创建的 shell 的子代。正如here 解释的那样,loggin shell 通过读取/etc/profile 来初始化,并且正如here 和更具体地说here 解释的环境元素被传输到子进程,特别是前缀为变量使用 EXPORT 关键字。


我试图了解在打开新(虚拟)终端时在 linux 下设置 PATH 的机制是什么。

我知道可以在多个文件中更改PATH(例如系统:/etc/{profile、bash.bashrc、...} 或用户: ~/{.profile, .bash_login, .bashrc... },其中一些在登录时读取,另一些在打开时读取(虚拟)终端。

根据我的测试,“profile”文件似乎是在启动时读取的(当用户登录时),它为诸如PATH 之类的变量注册了一些启动值。然后,每次打开终端时,这些启动值都会提供给其他脚本(例如 bashrc)以进行进一步配置,结果类似于:PATH_IN_TERMINAL=$BASHRC_ADDONS:$PATH_FROM_PROFILE

值得注意的是,~/.profile 在登录后通常不会被读取。更改此文件不会对当前会话产生任何影响,PATH 的 PATH_FROM_PROFILE 部分将保持不变,直到再次登录(例如在注销后或通过 ssh 连接后)。

我说的对吗?如果是这样,我在哪里可以找到有关该主题的文档?

谢谢

【问题讨论】:

  • 这完全是一个配置问题,您已经自己回答过了。归根结底,PATH 只是一个可以随意修改的值(可能继承自父进程);通过采购现有的配置文件来做到这一点只是一种方法,每台机器都可以有不同的设置。
  • 另外,~/.profile在登录后被读取是完全正常的; bash 忽略它并支持 ~/.bash_login 或 ~/.bash_profile (如果其中之一存在)是正常的。
  • 你用你的句子“(可能继承自父进程)”完美地总结了我的问题。正如我的问题中提到的,我了解标准配置文件以及读取它们的条件和顺序。但我找不到任何关于从登录 shell 到子终端(或就此而言的 shell)传输环境变量的信息。
  • Oups...实际上,我的问题确实很愚蠢。感谢您的关键字“继承”,我设法在谷歌中挖掘了相关页面,这让我想起了“出口”关键字的语义:s

标签: linux bash path


【解决方案1】:

这是我在该主题上找到的最佳解释:Startup Files

简单的解释,最常见的情况是:

  1. 在初次登录主机时,阅读/etc/profile,然后是第一个 ~/.bash_profile、~/.bash_login 或 ~/.profile。 ~/.profile 是 由多个shell支持,因此是首选。

  2. 当 Bash 启动时,但不是在登录后立即,阅读~/.bashrc。

因此,profile 文件旨在在登录时运行,并且应该用于打印初始消息(例如安全警告、每日消息)、检查邮件以及配置很少更改的设置/变量。系统范围(配额、MOTD 等)或用户特定(时区、区域设置、终端等)。

.bashrc 文件旨在供个人用户自定义他们的交互体验。例如定义别名、设置提示、添加到 PATH 等

我几乎总是将source ~/.bashrc 添加到我的.profile 文件的末尾,这样我的shell 总是可以根据我的要求进行定制,即使在登录后也是如此。

注意:以上内容仅适用于交互式 shell(例如,在终端上运行)。如果 bash 以非交互方式运行(例如通过 cron),则不会读取这些文件。在这些情况下,您应该创建一个包含所需变量的不同文件,并通过BASH_ENV 环境文件指定它。

【讨论】:

  • 感谢您的回答。我确实在 bash 手册页中阅读了相同的信息,但无法猜测交互式和非交互式之间的区别。谢谢你让我清楚。话虽如此,我终于意识到我的问题的答案在 EXPORT 关键字中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 2017-08-07
  • 2018-01-29
  • 1970-01-01
  • 2018-12-24
相关资源
最近更新 更多