Bash 确定要执行的程序类型。普通程序是以编译形式存在于系统中的系统命令。当执行此类程序时,会创建一个新进程,因为 Bash 会创建自身的精确副本。这个子进程与其父进程具有相同的环境,只是进程 ID 号不同。此过程称为forking。
在 forking 过程之后,子进程的地址空间将被新的进程数据覆盖。这是通过对系统进行 exec 调用来完成的。
fork-and-exec 机制因此将旧命令切换为新命令,而执行新程序的环境保持不变,包括输入和输出设备的配置、环境变量和优先级。此机制用于创建所有 UNIX 进程,因此也适用于 Linux 操作系统。即使是第一个进程 init(进程 ID 为 1),也是在所谓的bootstrapping(引导)过程中在启动程序期间 fork 的。
内置命令包含在 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 和 unalias。
特殊内置命令
当 Bash 在 POSIX 模式下执行时,特殊内置命令与其他内置命令在三个方面有所不同
在命令查找期间,特殊内置命令在 shell 函数之前被找到。
如果特殊内置命令返回错误状态,则非交互式 shell 将退出。
在命令完成之后,命令之前的赋值语句在 shell 环境中仍然有效。
POSIX 特殊内置命令包括 :, ., break, continue, eval, exec, exit, export, readonly, return, set, shift, trap 和 unset。
其中大多数内置命令将在接下来的章节中讨论。对于那些未讨论的命令,我们请参考 Info 页面。