1.3. 执行命令

1.3.1. 概述

Bash 确定要执行的程序类型。普通程序是以编译形式存在于系统中的系统命令。当执行此类程序时,会创建一个新进程,因为 Bash 会创建自身的精确副本。这个子进程与其父进程具有相同的环境,只是进程 ID 号不同。此过程称为forking

在 forking 过程之后,子进程的地址空间将被新的进程数据覆盖。这是通过对系统进行 exec 调用来完成的。

fork-and-exec 机制因此将旧命令切换为新命令,而执行新程序的环境保持不变,包括输入和输出设备的配置、环境变量和优先级。此机制用于创建所有 UNIX 进程,因此也适用于 Linux 操作系统。即使是第一个进程 init(进程 ID 为 1),也是在所谓的bootstrapping(引导)过程中在启动程序期间 fork 的。

1.3.2. Shell 内置命令

内置命令包含在 shell 本身中。当内置命令的名称用作简单命令的第一个单词时,shell 直接执行该命令,而无需创建新进程。内置命令对于实现使用单独的实用程序无法实现或不方便实现的功能是必要的。

Bash 支持 3 种类型的内置命令

其中大多数内置命令将在接下来的章节中讨论。对于那些未讨论的命令,我们请参考 Info 页面。

1.3.3. 从脚本执行程序

当要执行的程序是 shell 脚本时,bash 将使用 fork 创建一个新的 bash 进程。这个子 shell 每次从 shell 脚本中读取一行。每行上的命令都会被读取、解释和执行,就像它们直接来自键盘一样。

当子 shell 处理脚本的每一行时,父 shell 等待其子进程完成。当 shell 脚本中没有更多行要读取时,子 shell 终止。父 shell 唤醒并显示新的提示符。