我了解交互式登录和交互式非登录
根据这篇优秀的文章: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
您打开新终端时,您(已经)定义了所有环境变量。