命令执行(COMMAND EXECUTION)

命令被拆分为词之后,如果结果是一个简单命令和可选的参数列表,将执行 下面的操作。

如果命令名中没有斜杠,shell 试图定位命令位置。如果存在同名的 shell 函数,函数将被执行,像上面 FUNCTIONS 中讲到的一样。如果名称不是一个函数,shell 从 内建命令中搜索它。如果找到 对应命令,它将被执行。

如果名称既不是 shell 函数也不是一个内建命令,并且没有包含斜杠, bash 搜索 PATH 的每个成员,查找含有此文件名 (可执行文件) 的目录。 Bash 使用散列表来储存可执行文件的全路径 (参见下面的 shell 内建命令(SHELL BUILTIN COMMANDS) 中的 hash。 只有在散列表中没有找到此命令,才对 PATH 进行完整的搜索。如果搜索不成功,shell 输出错误消息,返回退出状态 127。

如果搜索成功,或者命令中包含一个或多个斜杠,shell 在单独的执行环境中 执行这个程序。参数 0 被设置为所给名称;命令的其他参数被设置为所给的参数, 如果有的话。

如果执行失败,因为文件不是可执行格式,并且此文件不是目录,就假定它是 一个 shell script (脚本),一个包含 shell 命令的文件。此时将孵化 (spawn) 出一个子 shell 来执行它。子 shell 重新初始化自身,效果就好像是 执行了一个新的 shell 来处理脚本一样,但是父 shell 保存的命令位置仍然被 保留 (参见下面的 shell 内建命令(SHELL BUILTIN COMMANDS) 中的 hash)。

如果程序是以 #! 开头的文件,那么第一行的其余部分指定了这个程序的解释器。 shell 执行指定的解释器,如果操作系统不会自行处理这种可执行文件格式的话。 解释器的参数由下面三部分组成:程序第一行中解释器名称之后的可选的一个参数, 程序的名称,命令行参数,如果有的话。