Ubuntu 桌面:为什么 .profile 脚本在交互式非登录 shell 中执行?

Ubuntu 桌面:为什么 .profile 脚本在交互式非登录 shell 中执行?

我了解交互式登录交互式非登录

根据这篇优秀的文章:Zsh/Bash 启动文件加载顺序(.bashrc、.zshrc 等)我们有下表

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

第一个链接引用另一篇精彩的文章:清理 bash 自定义哪里有关于交互式登录交互式非登录如下:

一个交互式登录shell 是您正在输入的 shell,这是您在机器上执行的第一个此类 shell。通常,您必须在 shell 启动前立即登录。例如,当您通过 SSH 连接到远程系统并向该系统输入命令时,您正在输入交互式登录 shell。

一个交互式非登录 shell是在您登录后启动的新 shell;不需要您再次登录。例如,如果你在图形用户界面中打开一个新的终端窗口并得到一个 shell 提示符,这是一个交互式非登录 shell。交互式非登录 shell 的另一个示例是从文本编辑器内部启动的子 shell;例如,在 vi 中输入 :sh。

关于前者,它实际上是在 Ubuntu 中强制应用的服务器环境 - 每个人的工作环境tty都需要登录,因此根据表格~/.profile使用(我确认不存在~/.bash_profile任何~/.bash_login文件)。它申请su - otheruser(它要求输入密码),因此他/她自己的~/.profile文件也会被执行。直到这里我都很好。

关于后者 - 这篇文章的原因 - Ubuntu桌面环境,它适用于默认情况下只打开一个选项卡的新窗口/终端,因此根据表格应该执行/etc/bash.bashrc~/.bashrc文件和不是文件.profile

为什么如果执行终端:

  • echo $JAVA_HOME (定义于.profile
  • echo $M2_HOME (定义于.profile
  • echo $GRADLE_HOME(定义于.profile
  • which java
  • which mvn
  • which gradle

所有命令都可以正常工作吗?

Ctrl + Shift + T同一窗口内任何新选项卡 ( ) 的行为均相同即使对于新的终端窗口,它仍然有其独特的默认选项卡

我读了以下帖子:

而且我没有提到的设置(第二个适用于 Ubuntu 桌面 18:04):

  • .bashrc文件未引用或提供该.profile文件
  • Edit--> Preferences--> - Unamed> Command tab--> Run command as login shell(未选中)

答案1

登录外壳(系统范围/etc/profile、中的任何脚本/etc/profile.d、您的本地文件~/.profile和您列出的其他文件)定义您当前用户的环境 - 自您登录以来。

任何未登录您随后打开的 shell 至少会继承登录 shell 的环境。这就是为什么当.profile您打开新终端时,您(已经)定义了所有环境变量。

相关内容