Login shell 是登录到交互式会话(interactive session)时使用用户 ID 执行的第一个进程。
这个解释乍一看比较简单,但仔细想想又有些模糊。为了便于理解,下面我们重新看一下 Linux 系统的登录过程。
Linux 是一个多用户的操作系统,可以允许多个用户同时登录和使用系统。
Linux 系统的第一个进程,不管是 init 还是 systemd,都会启动 getty 程序。这个 getty,是“get tty”(tty表示物理或虚拟终端)的缩写,负责保护系统免受未经授权的访问。
当你尝试连接到 Linux 系统(登录本地系统,或者通过 ssh 连接远程服务器)时,getty 会(通过登录程序)提示你输入用户名,输入完用户名后,又会提示你输入密码。
登录时输入的信息(用户名和密码),系统会将其根据存储在 /etc/passwd 中的信息进行验证。/etc/passwd 文件中存储的信息包含用户名、用户 ID、主目录以及登录成功后要启动的第一个程序等。
如上图所示,用户 abhishek 登录时启动的第一个程序(针对 Linux 中的标准用户),是 Login Shell。
字段中也可能有其他值。比如,sshd 是一个系统用户,而不是一个真正的用户,它不能像 abhishek 这样的普通用户那样以交互方式登录系统。如下所示:
如果第一个程序那一列中没有信息,那么默认为 /bin/sh,即标准 shell。
Login shell 和 non-login shell
我们登录到一个系统,知道它是一个 login shell,那么这意味着什么呢?是不是还有其他 shell 呢?
在 Linux 中,当你运行一个 shell 脚本时,它是在自己的 shell(非交互式 shell)中运行的。你可以在当前 shell(交互式 shell)中启动一个新 shell。
从技术角度讲,这些都是子 shell。
shell 的配置文件和 RC 文件
login shell 从 /etc/profile 和主目录中的配置文件中读取环境变量和其他配置,这得以让我们可以使用 tab 补全键、设置彩色输出以及其他内容(比如 umask)等。
你可能知道在 Linux 系统中可用不止一个 shell,大多数 Linux 发行版都默认使用 bash shell,你也可以安装其他的 shell,比如 zsh 或者 Fish shell。
如果你的 login shell 是 bash,那么其配置文件为 /etc/profile 和 ~/.bash_profile,如果是 zsh,它的配置文件为 /etc/zprofile 和 ~/.zprofile。
/etc 目录中的文件通常为系统中为用户设置的各自 shell 的配置,这通常由系统管理员设置。
用户主目录中的文件是特定于用户的。这允许用户为常用命令创建别名或为程序使用自定义 PATH 变量。
non-login shell 源于 login shell,因此它通过配置文件获取登录shell设置的所有环境。除此之外,非登录交互式shell可以通过/etc/home目录中的rc(资源配置)文件定义自己的环境变量。
对于bash shell,通常是 /etc/bash.bashc 和 ~/.bashrc 文件,而对于zsh shell,则是 /etc/zshrc 和 ~/.zshrc 文件。
看下面的例子:
上图中,shell 读取 /etc/bash.bashrc 文件后,其提示符变成了绿色。Ubuntu 在该文件中添加了其他参数,颜色设置是其中之一。
概况一下:
- 配置文件用于交互式 login shell,rc 文件用于交互式 non-login shell;
- 首先执行/etc/directory中的文件,然后执行home目录中的文件;
- 配置文件和 rc 文件同时作用于非交互式的 non-login shell。
如何查看当前是否在 login shell 中?
这非常简单,至少对于 bash shell 来说是这样。对于 login shell,shell 可执行文件的名称以 - 开头。对于non-login shell,它只是 shell 的名称。
在桌面 Linux上,通常不使用 login shell,登录由显示管理器管理。这就是为什么当在 Linux 桌面上打开一个终端时,我们会看到即使是在终端中运行的第一个 shell 也不是login shell。