bash中的简单命令是否可以在子外壳中运行,因为单个命令可以构成管道?

时间:2019-12-02 18:29:12

标签: bash

Bash参考手册状态:

  

管道是一个或多个命令的序列

因此,没有任何命令因此可以被视为管道吗?这似乎不是纯粹的语义问题,因为该手册还指出:

  

管道中的每个命令都在其自己的子shell中执行

因此,这实际上意味着像echo foo这样简单的事情可以在子shell中运行吗?

3 个答案:

答案 0 :(得分:5)

该手册不是正式规范。 bash遵循的正式规范(实现了一个大的超集)是the POSIX shell command language。该规范更清楚地说明了规则in section 2.12,并添加了用于强调的格式:

  

此外,多命令管道中的每个命令 都位于子外壳环境中[...]

因此,简单的单命令管道(1)实际上是管道;但是(2)不会调用子shell。

答案 1 :(得分:0)

是的,单个命令也是管道。要验证这一点,请运行任何逗号,例如echo foo,然后使用以下命令打印PIPESTATUS变量。

echo ${PIPESTATUS[0]}

答案 2 :(得分:0)

向后工作,您的最后一条语句是正确的,即在bash提示符下运行单个命令会导致派生。因此从这种意义上讲,单个命令被视为管道。

但是bash -c 'echo hello'不会引起额外的派生。

与诸如bash -c 'echo hello|wc'之类的“适当”管道相比,单个命令被视为一种特殊情况,后者创建2个派生,每个派生1个以处理echowc,而原始过程等待那些孩子完成。

尽管我不得不说echo这样简单的东西实际上是一个内部命令,这意味着它完全在bash可执行文件中实现,并且子程序永远不会执行。