Bash参考手册状态:
管道是一个或多个命令的序列
因此,没有任何命令因此可以被视为管道吗?这似乎不是纯粹的语义问题,因为该手册还指出:
管道中的每个命令都在其自己的子shell中执行
因此,这实际上意味着像echo foo
这样简单的事情可以在子shell中运行吗?
答案 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个以处理echo
和wc
,而原始过程等待那些孩子完成。
尽管我不得不说echo
这样简单的东西实际上是一个内部命令,这意味着它完全在bash可执行文件中实现,并且子程序永远不会执行。