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

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

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

答案1

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

[[ -f ~/.bashrc ]] && . ~/.bashrc

这意味着登录 shell(读取)~/.profile也将读取~/.bashrc,从而使它们的行为类似于非登录交互式 shell。或者,除了为登录 shell 设置的内容外,使它们具有与非登录交互式 shell 相同的设置。

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

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

xset b off 

由于我的.bashrc只能由交互式、非登录 shell 读取,并且这些 shell 从未以图形方式运行,因此这是一种禁用铃声的简单方法。但是,由于我的发行版已切换为具有~/.profile~/.bashrc,因此当我在非 GUI 环境中通过 登录时也会执行该命令,ssh并且由于xset需要正在运行的X会话,因此会产生错误。

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

相关内容