Bash 如何处理命令行?

Bash 如何处理命令行?

学习 Newham 的 Bash Shell:

shell 从标准输入或脚本读取的每一行称为管道;它包含一个或多个由零个或多个竖线字符 (|) 分隔的命令。对于它读取的每个管道,shell 将其分解为命令,设置管道的 I/O,然后执行每个命令如下(图7-1):

  1. 将命令拆分为由固定元字符集分隔的标记:SPACE、TAB、NEWLINE、;、(、)、<、>、|, 和 &。标记的类型包括单词、关键字、I/O 重定向器和分号。
  1. shell 将管道分解为由 分隔的命令后|,为什么|仍将其列为在每个命令中分隔标记的元字符?可以|出现在每个命令中吗?

  2. Bash 手册说,当 bash shell 运行管道时,它会分叉一个子 shell 来运行管道中的每个命令。

    对于管道中的每个命令,哪个 shell“对每个命令执行以下操作”:为该命令分叉的子 shell,还是原始 shell?

答案1

  • 管道字符|是元字符,因为它结束未引用的单词。这是使 shell 语言易于理解所必需的。

  • shell 为管道创建各种进程的方式不是标准化的,并且在实现之间也有所不同。

Bourne Shell 最初确实创建了一个sub-shell,然后成为管道中所有进程的父进程,并最终启动管道中最右边的程序。该方法比其他方法需要更少的代码,并且允许简单地实现作业控制。

Bash 以类似的方式工作。

Ksh93 使管道中的每个进程都成为原始 shell 的直接子进程。

相关内容