1. 父 Shell

父 Shell 是用于登录某个远程主机或虚拟控制器终端或在 GUI 中运行终端仿真器时所启动的默认的交互式 Shell 。

Linux Shell 中在当前 Shell 执行脚本文件的方式有:

1
2
source script             # 在当前 Shell 执行 script 文件
. script # 在当前 Shell 执行 script 文件

2. 子 Shell(subshell)

子 Shell 是父 Shell 进程调用了 fork() 函数,在内存中复制出一个与父 Shell 进程几乎完全一样的子进程。

  • 子 Shell 继承了父 Shell 的所有环境变量(包括全局和局部变量)

  • 可以通过环境变量 BASH_SUBSHELL(其值表明子 Shell 的嵌套深度)判断是第几层子 Shell(0 说明当前 Shell 不是子 Shell)

Linux Shell 中创建子 Shell 的方式有:

1
2
3
`command[;command...]`        # command 在子 Shell 中执行
( command[;command...] ) # command 在子 Shell 中执行(可嵌套)
command1 | command2 # command1 和 command2 都在子 Shell 中运行

3. 孩子 Shell(child shell)

孩子 Shell 是父 Shell 进程调用了 fork() 函数后又调用了 execve() 函数来执行新的 shell 命令(比如 bash),从而覆盖 fork() 复制出来的 Shell 子进程。

  • 孩子 Shell 只继承到父 Shell 的全局环境变量(而不能访问到父 Shell 的局部环境变量)
  • 可以通过环境变量 SHLVL(其值表明孩子 Shell 的嵌套深度)判断是第几层孩子 Shell(启动的第一个 Shell 其 SHLVL 为 1)

Linux Shell 中创建孩子 Shell 的方式有:

1
2
bash script       # 以 Bash Shell 为例,script 在孩子 Shell 中执行
./script # 前提是 script 文件具有可执行权限,script 在孩子 Shell 中执行