LinuxShell分类
Linux Shell 从交互式和登录式来看可划分为不同的类别。
1. 交互式 Shell
交互式 Shell 是指在终端命令行上执行,以提示符的方式在终端等待用户输入,并实时运行用户输入的命令的模式;即与用户交互的模式。
1.1 交互登录式 Shell
交互登录式 Shell 是需要用户名和密码登录后进入的 Shell(比如终端下登录远程服务器)或者通过 -login
选项在终端启动的 Shell 。
-
交互登录式 Shell 可以使用
exit
或logout
命令退出 Shell -
登录本地桌面 Linux 系统本质上也是登录一个 Linux Shell 会话,即交互登录式 Shell(这也是为什么系统会有注销/登出选项退出当前系统)
登录交互登录式 Shell 时
- 首先会读取
/etc/profile
启动文件
/etc/profile
文件是 Bash Shell 默认的主启动文件,不同 Linux 发行版其内容不尽相同
- 然后按照顺序读取第一个被找到的启动文件(
$HOME/.bashrc
文件不在其中是因为该文件通常通过以下文件运行):
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
登出交互登录式 Shell 时
- 首先会读取
$HOME/.bash_logout
文件- 然后会读取
/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
启动交互非登录式 Shell 时
- 只会读取
$HOME/.bashrc
文件(而不会读取/etc/profile
文件。这也是为什么修改/etc/profile
文件后,如果未重新登录系统,则新打开的交互非登录式 Shell 下并未产生影响的)
2. 非交互式 Shell
非交互式 Shell 是指以 Shell 脚本形式执行。在这种模式下,Shell 不与用户进行交互,而是读取存放在 Shell 脚本文件中的命令并执行,当读取到脚本文件结尾 EOF 时,Shell 终止。
启动非交互式 Shell 时
- 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 中执行脚本文件。