为什么必须在技术上将 shell 分为登录和非登录类型?

Boj*_*kić 5 bash login environment-variables

Shell 可以像由文本控制台运行的那样登录,也可以像由 Gnome 终端运行的那样非登录。为什么需要这种复杂性?为什么登录 shell 不能遵循与非登录相同的规则?

ter*_*don 1

首先,看看这个答案,了解登录 shell 和非登录 shell 之间的区别。基本上,他们读取不同的初始化文件。现在,许多发行版\xe2\x80\x94(包括 Debian)以及 Ubuntu\xe2\x80\x94 实际上正在朝着您所描述的方向发展。在这些发行版上,默认文件~/.profile~/.bash_profile文件包含如下内容:

\n\n
[[ -f ~/.bashrc ]] && . ~/.bashrc\n
Run Code Online (Sandbox Code Playgroud)\n\n

这意味着读取 \xe2\x80\x94 的登录 shell ~/.profile\xe2\x80\x94 也将读取~/.bashrc,使它们的行为类似于非登录交互式 shell。或者更确切地说,除了为登录 shell 设置的内容之外,还使它们具有与非登录交互式 shell 相同的设置。

\n\n

然而,有充分的理由让两者表现不同。例如,您可以通过坐在计算机前面运行图形会话或通过 ssh 远程访问一台计算机,这是很常见的。在后一种情况下,您将运行登录 shell,而在前一种情况下,您将打开运行非登录 shell 的终端。

\n\n

在这种情况下,您可能希望非 GUI shell 的行为有所不同。例如,多年来,我的~/.bashrc文件中都有以下命令来禁用铃声:

\n\n
xset b off \n
Run Code Online (Sandbox Code Playgroud)\n\n

由于我的.bashrc内容仅由交互式非登录 shell 读取,并且这些 shell 从未以图形方式运行,因此这是禁用响铃的简单方法。但是,由于我的发行版切换为使用~/.profilesource ,因此当我在非 GUI 环境中~/.bashrc通过 登录时,该命令也会被执行,并且由于需要运行会话,因此它产生了错误。sshxsetX

\n\n

更一般地说,让登录 shell 表现不同通常很有用,因为它们通常用于不同的目的。可能有些变量您只想设置为一种类型而不是另一种类型,或者您只想读取某些文件。诚然,在单用户家用计算机上将两者分开不太有用,但考虑到 Linux 多年来主要针对服务器市场,拥有多用户系统是非常正常的。在这种情况下,增加的复杂性是值得的,因为它使您能够对不同类型的 shell 的行为进行细粒度的控制。

\n