Man*_*dan 6 bash .profile environment-variables bashrc
我了解交互式登录和交互式非登录之间的区别
\n根据这篇优秀的文章:Zsh/Bash 启动文件加载顺序(.bashrc、.zshrc 等),我们有下表
\n+----------------+-----------+-----------+------+\n| |Interactive|Interactive|Script|\n| |login |non-login | |\n+----------------+-----------+-----------+------+\n|/etc/profile | A | | |\n+----------------+-----------+-----------+------+\n|/etc/bash.bashrc| | A | |\n+----------------+-----------+-----------+------+\n|~/.bashrc | | B | |\n+----------------+-----------+-----------+------+\n|~/.bash_profile | B1 | | |\n+----------------+-----------+-----------+------+\n|~/.bash_login | B2 | | |\n+----------------+-----------+-----------+------+\n|~/.profile | B3 | | |\n+----------------+-----------+-----------+------+\n|BASH_ENV | | | A |\n+----------------+-----------+-----------+------+\n| | | | |\n+----------------+-----------+-----------+------+\n| | | | |\n+----------------+-----------+-----------+------+\n|~/.bash_logout | C | | |\n+----------------+-----------+-----------+------+\nRun Code Online (Sandbox Code Playgroud)\n第一个链接引用了另一篇优秀的文章:清理 bash 自定义,其中提供了有关交互式登录和交互式非登录的出色解释,如下所示:
\n\n\n交互式登录shell 是您正在输入的 shell,这是您在计算机上执行的第一个此类 shell。通常,您必须在 shell 启动之前立即登录。例如,当您通过 SSH 连接到远程系统并向该系统键入命令时,您正在输入交互式登录 shell。
\n
\n\n交互式非登录 shell是在您登录后启动的新 shell;不需要您再次登录的\xe2\x80\x99。例如,如果您在图形用户界面中打开一个新的终端窗口并收到 shell 提示符,则 \xe2\x80\x99 是一个交互式非登录 shell。交互式非登录 shell 的另一个示例是从文本编辑器内部启动的子 shell;例如,在 vi 中输入 :sh。
\n
关于前者,它实际上强制适用于 Ubuntu Server环境 - 每次使用都tty需要登录,因此根据表使用~/.profile(我确认既不存在也不存在~/.bash_profile文件~/.bash_login)。它适用于su - otheruser(它要求他/她的密码),因此他/她自己的~/.profile文件也被执行。直到这里我都很好。
关于后者 - 这篇文章的原因 - Ubuntu桌面环境,它适用于默认情况下仅使用一个选项卡打开新窗口/终端时,因此根据表应该执行 and/etc/bash.bashrc文件~/.bashrc而不是文件.profile
但为什么 if 在该终端中执行:
\necho $JAVA_HOME (定义于.profile)echo $M2_HOME (定义于.profile)echo $GRADLE_HOME(定义于.profile)which javawhich mvnwhich gradle所有命令都正常工作吗?
\nCtrl + Shift + T对于同一窗口中的任何新选项卡 ( ),甚至对于再次具有其唯一默认选项卡的新终端窗口,都有相同的行为
我读了以下帖子:
\n\n我没有提到的设置(第二个适用于 Ubuntu 桌面 18:04):
\n.bashrc文件不引用或来源该.profile文件Edit--> Preferences--> Unamed-> Command tab--> Run command as login shell(未选中)为登录 shell执行的脚本(系统范围/etc/profile、中的任何脚本/etc/profile.d、您的本地~/.profile文件和您列出的其他文件)定义了当前用户的环境 - 自您登录以来。
您随后打开的任何非登录shell 至少都会继承您的登录 shell 的环境。.profile这就是为什么当您打开新终端时(已经)定义了所有环境变量。