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

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+----------------+-----------+-----------+------+\n
Run Code Online (Sandbox Code Playgroud)\n

第一个链接引用了另一篇优秀的文章:清理 bash 自定义,其中提供了有关交互式登录交互式非登录的出色解释,如下所示:

\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
\n

关于前者,它实际上强制适用于 Ubuntu Server环境 - 每次使用都tty需要登录,因此根据表使用~/.profile(我确认既不存在也不存在~/.bash_profile文件~/.bash_login)。它适用于su - otheruser(它要求他/她的密码),因此他/她自己的~/.profile文件也被执行。直到这里我都很好。

\n

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

\n

但为什么 if 在终端中执行:

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

所有命令都正常工作吗?

\n

Ctrl + Shift + T对于同一窗口中的任何新选项卡 ( ),甚至对于再次具有其唯一默认选项卡的新终端窗口,都有相同行为

\n

我读了以下帖子:

\n\n

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

\n
    \n
  • 这些.bashrc文件不引用或来源该.profile文件
  • \n
  • Edit--> Preferences--> Unamed-> Command tab--> Run command as login shell(未选中)
  • \n
\n

van*_*ium 9

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

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

  • 确切地说,继承是关键。不幸的是,几十年前,CDE(通用桌面环境)人员没有得到备忘录,并且从桌面弹出的终端(今天对于许多 DE 来说也是同样的问题)永远无法得到您的环境,因为 1)不是登录术语,2 )从非您的进程分叉,因此继承不起作用。导致如此多的垃圾被转储到 .bashrc 中。可怕的是,因为每个命令都完成了这些事情(运行 set -xv 并查看 bash 实际上必须执行什么) (3认同)
  • 根据流程图,无论您是在 TTY(交互式登录 shell)上还是在桌面环境(非交互式登录 shell)中登录,“profile”类型的文件都会在登录时执行。另外 .bashrc 也会运行,因为它是由配置文件获取的。登录后,当您打开新终端或子 shell(例如在 TTY 中)(交互式非登录 shell)时,仅运行 bashrc 类型文件。 (2认同)