这个想法是,用户每个主机最多应具有一个登录外壳。(也许我应该说,每个终端每个主机一个登录外壳程序—如果您同时通过多个终端登录到主机,则可能会有多个登录外壳程序。)通常(总是?)这是您获得的第一个外壳程序登录后(因此命名)。因此,该方案允许您指定每次登录只希望执行一次的操作,以及每次启动新的(交互式)shell时要执行的操作。
通常,登录后运行的所有其他外壳将是登录外壳的后代(一个孩子一个孩子……),因此将从登录外壳继承许多设置(环境变量umask
等)。,因此,这个想法是,在登录初始化文件(.login
,.profile
,等)应设置为可继承的设置,让.bashrc
(或任何你使用),处理不属于(的那些set
,shopt
非出口shell变量等)
另一个概念是,登录初始化文件(并且只有它们)应该进行“繁重的工作”,即占用大量资源的操作。例如,您可能希望在登录时让某些进程在后台运行(但只能复制一个(实例))。您可能希望在登录时显示一些状态信息(例如df
或who
),但并非每次启动新的交互式Shell时都会显示。特别是如果您有互动您希望每次登录时都运行的程序/对话框(即需要您输入信息的程序/对话框),您可能不希望每次启动新的Shell时都运行它。举一个极端的例子,二十年前,Solaris将您登录到一个非图形,无窗口的shell中。(我相信从那以后它已经发生了变化。)使用诸如之类的命令来启动窗口系统是(.login
或.profile
(或其他)的工作startx
。(之所以有用,部分原因在于有多个可用的窗口系统。不同的用户有不同的首选项。一些用户在不同的情况下使用不同的系统,并且我们在对话框中.profile
询问“您今天要使用哪个窗口系统?”)显然,您不希望每次打开新窗口或键入时都运行该命令sh
。
自从我使用了bash
除边缘情况以外的任何其他东西已经很久了。(例如,我使用编写脚本#!/bin/sh
,因此在某些系统上,我的脚本使用dash
和运行,而在另一些系统上,它们则以bash
POSIX模式运行。每年我运行几次csh
/ tcsh
几分钟,以查看其处理方式,或者回答一个问题。)如果您每天使用多个shell(例如bash
和zsh
),则您的模式可能会有所不同。如果您的主shell(如中的定义/etc/passwd
)是bash
,则您可能要调用一个zsh
登录shell,然后再调用一些zsh
从属的交互式非登录shell。您可能应该避免使用一个从属于另一个相同类型的登录Shell的登录Shell。
如登录Shell和非登录Shell的区别中所述?,OS X Terminal应用程序运行登录外壳程序,因此典型的用户通常会同时运行多个“登录外壳程序”。这是与我上面描述的模型有些不同的模型,并且可能需要用户重新考虑他.login
或他的行为.profile
(或其他)文件。我不知道OS X开发人员是否已记录了此设计决策的依据。但是我可以想象这种情况会有用的情况。曾经有一段时间,当我登录时习惯性地打开几个外壳窗口时,我会将它们设置为不同的文本和背景颜色(通过将ANSI转义序列写入屏幕)来帮助我跟踪哪个是哪个。终端颜色是某些示例的示例,这些示例不是子项继承的,而是保留在窗口中。因此,这是您每次启动新的“终端”窗口时要执行的操作,而不是每次启动新的交互式Shell时要执行的操作。