【发布时间】:2018-03-31 01:55:34
【问题描述】:
我的bash 4.4.19 版手册页说:
管道
管道是由控制运算符
|或|&之一分隔的一个或多个命令的序列。管道的格式为:
[time [-p]] [ ! ] command [ [|||&] command2 ... ]
当然。那讲得通。然后,在该部分的后面:
管道中的每个命令都作为单独的进程执行(即,在子外壳中)。
也是合理的,容易证明的:
$ pwd
/Users/ravron
$ ls | grep src # yes, src _does_ exist
src
$ cd src | true # cd in subshell has no effect on parent session
$ pwd
/Users/ravron
但是,我注意到上面对管道的定义是这样的,即使是一个简单的命令也是一个管道。毕竟,在语法中,除了command 之外的所有内容都是可选的:
[time [-p]] [ ! ] command [ [|||&] command2 ... ]
当然,现在,即使是在子 shell 中运行单个命令(man bash 术语中的“简单命令”)也将非常无用。 cd 不起作用,变量设置不起作用,等等。然而,现实——尽管简单的命令匹配(相当退化的)管道的语法,但不会在子 shell 中执行——似乎与手册页。以列表形式,这是我的理解:
- 管道的语法意味着简单的命令也是管道。
- 手册页说管道中的命令在子 shell 中运行。
- 简单的命令不在子 shell 中运行。
我错过了什么,或者这是man bash 中公认的无关紧要的错误?
【问题讨论】:
-
如果您想要真正的规范性文档,该文档是由语言律师为之奋斗的,那应该是pubs.opengroup.org/onlinepubs/9699919799/utilities/…。请注意,单命令情况 明确描述为管道。
-
...但是,请参阅该标准的第 2.9.1 节,“命令搜索和执行”小节,将内置的行为排除在“单独的实用程序”中发生的
execve()的通常要求之外环境”。
标签: bash