shell 从标准输入或脚本读取的每一行称为管道;它包含一个或多个由零个或多个竖线字符 (|) 分隔的命令。对于它读取的每个管道,shell 将其分解为命令,设置管道的 I/O,然后执行每个命令如下(图7-1):
- 将命令拆分为由固定元字符集分隔的标记:SPACE、TAB、NEWLINE、;、(、)、<、>、|, 和 &。标记的类型包括单词、关键字、I/O 重定向器和分号。
shell 将管道分解为由 分隔的命令后
|
,为什么|
仍将其列为在每个命令中分隔标记的元字符?可以|
出现在每个命令中吗?Bash 手册说,当 bash shell 运行管道时,它会分叉一个子 shell 来运行管道中的每个命令。
对于管道中的每个命令,哪个 shell“对每个命令执行以下操作”:为该命令分叉的子 shell,还是原始 shell?
答案1
管道字符
|
是元字符,因为它结束未引用的单词。这是使 shell 语言易于理解所必需的。shell 为管道创建各种进程的方式不是标准化的,并且在实现之间也有所不同。
Bourne Shell 最初确实创建了一个sub-shell
,然后成为管道中所有进程的父进程,并最终启动管道中最右边的程序。该方法比其他方法需要更少的代码,并且允许简单地实现作业控制。
Bash 以类似的方式工作。
Ksh93 使管道中的每个进程都成为原始 shell 的直接子进程。