2

我刚刚遇到直接调用或用反引号括起来时 wc -l 的输出不同。例如:

pgrep bash | wc -l

将输出 1,因为有一个 bash 进程正在运行。但是将此命令括在反引号中

echo `pgrep bash | wc -l`

会输出 2。我首先想到的是,反引号会打开一个新的 bash 进程,但是

echo `pgrep bash`

只找到与上述相同的一个过程。将命令包含在 $() 中时也是如此:

echo $(pgrep bash | wc -l)

这也将输出 2。有人知道为什么会这样吗?

4

2 回答 2

1

@cularis 真的应该为此获得赞誉,因为他在我有机会将其发布为答案之前(就在)将其发布为评论。

显然

pgrep bash | wc -l

不会创建新的 bash 进程;它能够直接从原始 bash 进程调用pgrep bash和调用。wc -l

echo `pgrep bash | wc -l`

确实|因为管道而创建了一个新的 bash 进程(新进程是管理嵌套反引号所需的所有 I/O 重定向和进程管理的最简单方法)。所以在这种情况下,pgrep bash除了用于执行命令的原始(交互式/)进程之外,还会看到新创建的用于处理管道的 bash 进程。

尝试

pgrep bash

echo `pgrep bash | cat`

快速浏览一下 bash 文档(info bash第 3.5.4 节,命令替换),我看不到任何说明何时创建新进程以及何时不创建新进程的内容。

于 2011-08-24T18:46:10.200 回答
0

谢谢你们的帮助。我实际上找到了一个更好的解决方案。而不是使用 wc -l 我应该只使用 -c 参数,它只打印匹配进程的计数。好吧,又是 RTFM。;-)

于 2011-08-24T19:49:38.620 回答