我有一个基本的了解点文件在*nix系统中。但我对此仍然很困惑登录 Shell 和非登录 Shell 之间的区别?
一堆不同的答案(包括多个重复的答案)已经解决了以下问题:
- 如何调用A登录或者未登录壳
- 如何探测A登录或者未登录壳
- 什么启动文件将被消耗登录或者未登录壳
man bash
有关更多详细信息,请参阅文档(例如, )
答案没有告诉我们(也是我仍然感到困惑的事情)是:
是什么用例的一个登录或者未登录壳? (例如,我只配置了
zshrc
,zsh
这足以满足大多数个人开发要求,我知道这并不像“vimrc
做什么”那么简单vim
)是什么原因使用一个登录在...之上未登录shell(除了消耗不同的启动文件和生命周期)?
答案1
这个想法是,每个主机上的用户应该(最多)有一个登录 shell。 (也许我应该说,每个主机每个终端一个登录 shell — 如果您通过多个终端同时登录到一台主机,您会期望有多个登录 shell。)这通常(总是?)第一的登录后获得的 shell(因此得名)。因此,此方案允许您指定每次登录时只发生一次的操作以及每次启动新的(交互式)shell 时希望发生的事情。
通常情况下,每一个登录后运行的其他 shell 将是登录 shell 的后代(子代的子代……),因此umask
将从登录 shell 继承许多设置(环境变量等)。因此,我们的想法是登录初始化文件(.login
、.profile
等)应该设置可继承的设置,并让(或您使用的任何其他文件)处理不是( 、、非导出 shell 变量).bashrc
的设置, ETC。)set
shopt
另一个概念是登录初始化文件(并且只有它们)应该执行“繁重的工作”,即资源密集型操作。例如,您可能希望在登录时让某些进程在后台运行(但只有其中一个副本(实例))。您可能希望在登录时显示一些状态信息(例如 或df
)who
,但不是每次启动新的交互式 shell 时都显示。特别是如果您有交互的如果您希望在每次登录时运行一个程序/对话框(即需要您输入的程序/对话框),您可能不希望在每次启动新 shell 时都运行它。举一个极端的例子,二十年前,Solaris 让您登录到一个单一的、非图形化、非窗口的 shell。 (我相信从那时起它已经发生了变化。).login
或(或其他什么)的工作是.profile
使用像 之类的命令来启动窗口系统startx
。 (这很有用,部分原因是有多个可用的窗口系统。不同的用户有不同的偏好。一些用户在不同的情况下使用不同的系统,我们有一个对话框询问.profile
“您今天想使用哪个窗口系统?”)显然,您不希望每次打开新窗口或键入 时都运行它sh
。
我已经很久没有使用bash
除边缘情况之外的任何东西了。 (例如,我使用 编写脚本#!/bin/sh
,因此在某些系统上,我的脚本使用 运行dash
,而在其他系统上,它们以 POSIX 模式运行bash
。一年中我会运行几次csh
/tcsh
几分钟来查看它如何处理某些内容,或者回答问题。)如果您每天使用多个 shell(例如,bash
和),您的模式可能会有所不同。zsh
如果您的主 shell(如 中所定义/etc/passwd
)是bash
,您可能想要调用一个zsh
登录 shell,然后可能调用一些zsh
从属于该 shell 的交互式非登录 shell。您应该避免让一个登录 shell 从属于另一个相同类型的登录 shell。
正如中提到的登录 Shell 和非登录 Shell 之间的区别?,OS X 终端应用程序运行登录 shell,因此典型用户通常会同时运行多个“登录 shell”。这是与我上面描述的模型有些不同的模型,并且可能需要用户重新考虑他在他的文件.login
或.profile
(或其他)文件中所做的事情。我不知道 OS X 开发人员是否已记录了他们做出此设计决策的理由。但我可以想象在这种情况下这会很有用。曾经有一段时间,我在登录时习惯性地打开一些 shell 窗口,并将它们设置为不同的文本和背景颜色(通过将 ANSI 转义序列写入屏幕)以帮助我跟踪哪个是哪个。终端颜色是一个不由子子继承但在窗口中持续存在的颜色的示例。因此,这是您每次启动新的终端窗口时都希望执行的操作,但不是每次启动新的交互式 shell 时都执行的操作。