1.3.1. 纵览
Bash 决定要执行的程序的类型。普通程序是已编译形在于系统中的系统命令。当执行这样的程序时,会创建一个新进程。这个子进程和它的父进程有相同的环境,只是进程ID号不同。这个过程称为forking。
forking进程后,子进程的地址被新的进程数据覆盖。这是通过exec调用来完成的。
因此,fork-and-exec机制将旧命令切换为新命令,而新程序执行的环境保持不变,包括输入和输出设备的配置、环境变量和优先级。该机制用于创建所有 UNIX 进程,因此也适用于 Linux 操作系统。即使是进程 ID 为 1的第一个进程init,也会在所谓的bootstrapping 过程中forking。
1.3.2. Shell 内置命令
内置命令包含在 shell 。当内置命令的名称为简单命令的第一个单词时,shell 直接执行命令,而不创建新进程。
Bash 支持 3 种类型的内置命令:
- Bourne Shell 内置:
:, ., break, cd, continue, eval, exec, exit, export, getopts, hash, pwd, readonly, return, set, shift, test, [, times, trap, umask , unset. - Bash 内置命令:
alias, bind, builtin, command, declare, echo, enable, help, let, local, logout, printf, read, shopt, type, typeset, ulimit and unalias. - 特殊的内置命令:
当 Bash 在 POSIX 模式下执行时,特殊的内置命令在三个方面不同于其他内置命令:- 在命令查找期间可以在 shell 函数之前找到特殊的内置函数
- 如果一个特殊的内置函数返回一个错误状态,一个非交互式的 shell 就会退出。
- 命令完成后,命令之前的赋值语句在 shell 环境中仍然有效。
POSIX 特殊的内置函数是 :, ., break, continue, eval, exec, exit, export, readonly, return, set, shift, trap and unset.
1.3.3.从脚本执行程序
当正在执行的程序是 shell 脚本时,bash 将使用fork创建一个新的 bash 进程。该子shell 一次从shell 脚本中读取一行。每一行的命令都被读取、解释和执行,就好像它们直接来自键盘一样。
当子 shell 处理脚本的每一行时,父 shell 等待其子进程完成。当 shell 脚本中没有更多行可读取时,子 shell 终止。父 shell 唤醒并显示新的提示。