LinuxShell分类

Linux Shell 从交互式和登录式来看可划分为不同的类别。

1. 交互式 Shell

交互式 Shell 是指在终端命令行上执行,以提示符的方式在终端等待用户输入,并实时运行用户输入的命令的模式;即与用户交互的模式。

1.1 交互登录式 Shell

交互登录式 Shell 是需要用户名和密码登录后进入的 Shell(比如终端下登录远程服务器)或者通过 -login 选项在终端启动的 Shell 。

  • 交互登录式 Shell 可以使用 exitlogout 命令退出 Shell

  • 登录本地桌面 Linux 系统本质上也是登录一个 Linux Shell 会话,即交互登录式 Shell(这也是为什么系统会有注销/登出选项退出当前系统)

\blacktriangle 登录交互登录式 Shell 时

  1. 首先会读取 /etc/profile 启动文件
  • /etc/profile 文件是 Bash Shell 默认的主启动文件,不同 Linux 发行版其内容不尽相同
  1. 然后按照顺序读取第一个被找到的启动文件($HOME/.bashrc 文件不在其中是因为该文件通常通过以下文件运行):
  • $HOME/.bash_profile
  • $HOME/.bash_login
  • $HOME/.profile

\blacktriangle 登出交互登录式 Shell 时

  1. 首先会读取 $HOME/.bash_logout 文件
  2. 然后会读取 /etc/bash.bash_logout 文件(该文件并不是所有 Linux 发行版都有,比如 Manjaro 20.0 有但 Ubuntu 20.04 则没有)

【注】如果将一些设定的系统全局环境变量存放在 /etc/profile 文件中,那么当所用 Linux 发行版升级时,该文件也会跟着升级,则所定制的所有变量设置就都被覆盖了。

  • 存储系统永久性环境变量:最好的办法是将所定制的系统全局变量存放在 /etc/profile.d 目录下新建的一个以 .sh 结尾的文件中(而不是直接修改 /etc/profile 文件)。
  • 存储个人用户永久性环境变量:将个人用户所有定制的环境变量写入 $HOME/.bashrc 文件中。

1.2 交互非登录式 Shell

交互非登录式 Shell 是指不需要用户名和密码也不指定 -login 选项即可打开的 Shell(比如直接在终端运行 bash 打开一个 Bash Shell;或者在 Linux 系统桌面上打开一个终端 terminal 窗口程序)。

  • 交互非登录式 Shell 只能使用 exit 退出 Shell

\blacktriangle 启动交互非登录式 Shell 时

  1. 只会读取 $HOME/.bashrc 文件(而不会读取 /etc/profile 文件。这也是为什么修改 /etc/profile 文件后,如果未重新登录系统,则新打开的交互非登录式 Shell 下并未产生影响的)

2. 非交互式 Shell

非交互式 Shell 是指以 Shell 脚本形式执行。在这种模式下,Shell 不与用户进行交互,而是读取存放在 Shell 脚本文件中的命令并执行,当读取到脚本文件结尾 EOF 时,Shell 终止。

\blacktriangle 启动非交互式 Shell 时

  1. Bash Shell 提供了 BASH_ENV 环境变量用于指定启动非交互式 Shell 时需要启动的文件(大多数 Linux 发行版没有设定该环境变量)

【注】如果 BASH_ENV 环境变量没有设定,也不意味着非交互式 Shell 就无法使用任何系统全局变量。因为非交互式 Shell 一般作为交互式 Shell 的孩子 Shell(不是子 Shell,详情参见 LinuxShell父子关系概述)启动,故会继承父 Shell 的全部全局环境变量;或者直接在交互式 Shell 下执行,故也可以直接使用当前 Shell 的所有环境变量。

2.1 执行 Shell 脚本文件方式

Linux 下执行 Shell 脚本文件有两种方式,以下以 Bash Shell 为例:

  • source script. script
    以这种方式执行脚本文件不会创建孩子 Shell(child shell),直接在当前 Shell 执行脚本文件中的命令。

  • bash script./script
    以这种方式执行脚本文件会创建孩子 Shell(child shell),并在孩子 Shell 中执行脚本文件。