非交互式登录 shell 是否执行“~/.profile”或名称为“$BASH_ENV”的文件?

非交互式登录 shell 是否执行“~/.profile”或名称为“$BASH_ENV”的文件?

bash手册

作为交互式登录 shell 调用,或使用 --login 调用

当 Bash 作为交互式登录 shell 或作为带有 --login 选项的非交互式 shell,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个存在且可读的文件中读取并执行命令。启动 shell 时可以使用 --noprofile 选项来禁止此行为。

当交互式登录 shell 退出或非交互式登录 shell 执行 exit 内置命令时,Bash 会从文件 ~/.bash_logout(如果存在)中读取并执行命令。

作为交互式非登录 shell 调用

...

非交互调用

当 Bash 启动时非交互地,例如,要运行 shell 脚本,它会在环境中查找变量 BASH_ENV,如果它出现在其中,则扩展其值,并使用扩展后的值作为要读取和执行的文件的名称。 Bash 的行为就像执行了以下命令:

如果[-n“$BASH_ENV”];然后 。 “$BASH_ENV”;菲

但 PATH 变量的值不用于搜索文件名。

如上所述,如果使用 --login 选项调用非交互式 shell,Bash 会尝试从登录 shell 启动文件读取并执行命令。

非交互式登录 shell 属于哪种情况,第一种情况还是第三种情况?

第一种情况“作为交互式登录 shell 调用,或使用 --login 调用”包含“使用 --login 选项的非交互式 shell”的场景,所以我推断出

  • 第一种情况是登录 shell,无论是交互式还是非交互式,并且

  • 第三种情况是非交互式非登录 shell。

我对么?

谢谢。

答案1

不,你不正确。 Bash 的行为如文档所述:

  • 第一部分适用于交互式登录 shell,以及以 标志启动的非交互式 shell --login
  • 第三部分适用于非交互式 shell,包括非交互式登录 shell不是从旗帜开始--login

shell 可以是不带--login标志的登录 shell。如果您/proc/$$/cmdline在 Linux 系统上查看通过 SSH 启动的 Bash shell,您会发现它的启动方式为-bash— 前导连字符是启动登录 shell 的常用方式,如果它结束,则不包含在第一部分中成为非交互式的。然而,如果出于某种原因想要一个非交互式登录 shell,人们通常会使用--login它来获取它。

相关内容