为什么在非登录外壳上使用登录外壳?


24

我有一个基本的了解点文件中的* nix系统。但是我仍然对登录外壳程序和非登录外壳程序之间的区别感到困惑吗?

一堆不同的答案(包括重复的答案)已经解决了以下问题:

  • 如何调用一个登录非登录
  • 如何检测一个登录或者非登录
  • 什么启动文件将被消耗登录或者非登录
  • man bash有关更多详细信息,请参阅文档(例如)

答案没有说明(还有我仍然感到困惑的地方)是:

  • 什么是用例一的登录或者非登录壳呢?(例如,我只配置zshrczsh和这足以让大多数个人开发的要求,我知道这不是这么简单什么vimrcvim

  • 非登录外壳上使用登录原因是什么(除了使用不同的启动文件和生命周期之外)?

Answers:


15

这个想法是,用户每个主机最多应具有一个登录外壳。(也许我应该说,每个终端每个主机一个登录外壳程序—如果您同时通过多个终端登录到主机,则可能会有多个登录外壳程序。)通常(总是?)这是您获得的第一个外壳程序登录后(因此命名)。因此,该方案允许您指定每次登录只希望执行一次的操作,以及每次启动新的(交互式)shell时要执行的操作。

通常,登录后运行的所有其他外壳将是登录外壳的后代(一个孩子一个孩子……),因此将从登录外壳继承许多设置(环境变量umask等)。,因此,这个想法是,在登录初始化文件(.login.profile,等)应设置为可继承的设置,让.bashrc(或任何你使用),处理不属于(的那些setshopt非出口shell变量等)

另一个概念是,登录初始化文件(并且只有它们)应该进行“繁重的工作”,即占用大量资源的操作。例如,您可能希望在登录时让某些进程在后台运行(但只能复制一个(实例))。您可能希望在登录时显示一些状态信息(例如dfwho),但并非每次启动新的交互式Shell时都会显示。特别是如果您有互动您希望每次登录时都运行的程序/对话框(即需要您输入信息的程序/对话框),您可能不希望每次启动新的Shell时都运行它。举一个极端的例子,二十年前,Solaris将您登录到一个非图形,无窗口的shell中。(我相信从那以后它已经发生了变化。)使用诸如之类的命令来启动窗口系统是(.login.profile(或其他)的工作startx。(之所以有用,部分原因在于有多个可用的窗口系统。不同的用户有不同的首选项。一些用户在不同的情况下使用不同的系统,并且我们在对话框中.profile询问“您今天要使用哪个窗口系统?”)显然,您不希望每次打开新窗口或键入时都运行该命令sh

自从我使用了bash 除边缘情况以外的任何其他东西已经很久了。(例如,我使用编写脚本#!/bin/sh,因此在某些系统上,我的脚本使用dash和运行,而在另一些系统上,它们则以bashPOSIX模式运行。每年我运行几次csh/ tcsh几分钟,以查看其处理方式,或者回答一个问题。)如果您每天使用多个shell(例如bashzsh),则您的模式可能会有所不同。如果您的主shell(如中的定义/etc/passwd)是bash,则您可能要调用一个zsh登录shell,然后再调用一些zsh从属的交互式非登录shell。您可能应该避免使用一个从属于另一个相同类型的登录Shell的登录Shell。

登录Shell和非登录Shell的区别中所述,OS X Terminal应用程序运行登录外壳程序,因此典型的用户通常会同时运行多个“登录外壳程序”。这是与我上面描述的模型有些不同的模型,并且可能需要用户重新考虑他.login或他的行为.profile(或其他)文件。我不知道OS X开发人员是否已记录了此设计决策的依据。但是我可以想象这种情况会有用的情况。曾经有一段时间,当我登录时习惯性地打开几个外壳窗口时,我会将它们设置为不同的文本和背景颜色(通过将ANSI转义序列写入屏幕)来帮助我跟踪哪个是哪个。终端颜色是某些示例的示例,这些示例不是子项继承的,而是保留在窗口中。因此,这是您每次启动新的“终端”窗口时要执行的操作,而不是每次启动新的交互式Shell时要执行的操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.