登录 Shell 和非登录 Shell 之间的区别

Fumbani Banda 2023年1月30日
  1. 什么是基于 UNIX 的系统中的 Shell
  2. 什么是基于 UNIX 的系统中的登录 Shell
  3. 什么是基于 UNIX 的系统中的非登录 Shell
登录 Shell 和非登录 Shell 之间的区别

本教程解释了基于 UNIX 的系统中登录 shell 和非登录 shell 之间的区别。

什么是基于 UNIX 的系统中的 Shell

基于 UNIX 的系统中的 shell 是用户和操作系统内核之间的接口。它从用户那里获取输入并将其发送到内核,并将结果从内核获取到用户。

有两种类型的 shell,登录 shell 和非登录 shell。

每个 shell 在启动后都会执行一系列启动脚本来设置环境。这些脚本有不同的用途,它们都会影响环境。

后续脚本可以覆盖先前脚本设置的值。

什么是基于 UNIX 的系统中的登录 Shell

登录 shell 是使用 /bin/login 通过读取 /etc/passwd 文件成功登录后启动的第一个进程。登录 shell 在你的用户 ID 下执行。

当你使用终端登录、切换到另一个用户或使用 SSH 时,会执行登录 shell。

一旦登录 shell 启动,它就会执行一组启动脚本来设置 shell 环境。执行以下脚本。

  1. 登录过程执行/etc/profile
  2. /etc/profile 执行 /etc/profile.d 中的脚本
  3. 登录过程执行~/.bash_profile
  4. ~/.bash_profile 执行 ~/.bashrc
  5. ~/.bashrc 执行 /etc/bashrc

以下命令用于指示 shell 是否为登录 shell。

echo  $0

得到 -bash-su 作为输出表明 shell 是一个登录 shell。记下输出前的 - 符号。

在下图中,echo $0 命令的输出在 bash 前面有一个 -。它表明 shell 是一个登录 shell。

登录 shell

什么是基于 UNIX 的系统中的非登录 Shell

登录 shell 启动一个非登录 shell。它可以是一个以没有登录的进程启动的 shell,也可以是从另一个 shell 启动的 shell。进程使用 shell 可执行文件的名称来启动非登录 shell。

将 bash shell 作为非登录 shell 运行会执行以下脚本。

  1. 非登录进程执行~/.bashrc
  2. ~/.bashrc 执行 /etc/bashrc
  3. /etc/bashrc 执行 /etc/profile.d/

要确定 shell 是否为非登录 shell,请运行以下命令。

echo $0

如果输出是 bashsu 而没有前面的 - 符号,则 shell 是非登录 shell。

我们执行下图中的 echo $0 命令,输出显示 bash 前面的 -。这意味着我们正在使用登录 shell。

要启动一个非登录 shell,我们输入 shell 可执行文件的名称,在我们的例子中是 bash。我们再次执行 echo $0 命令来查看新启动的 shell 是什么类型的 shell; echo 命令的输出是 bash 没有 -。这意味着新 shell 是非登录 shell。

非登录 shell

作者: Fumbani Banda
Fumbani Banda avatar Fumbani Banda avatar

Fumbani is a tech enthusiast. He enjoys writing on Linux and Python as well as contributing to open-source projects.

LinkedIn GitHub

相关文章 - Linux Shell