如果在反引号中执行,为什么wc -l的输出会有所不同?

时间:2011-08-24 16:23:16

标签: bash wc

我刚刚遇到wc -l的输出在直接调用或包含在反引号中时有所不同。例如:

pgrep bash | wc -l

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

echo `pgrep bash | wc -l`

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

echo `pgrep bash`

只找到与上面相同的一个过程。将命令括在$():

中时也是如此
echo $(pgrep bash | wc -l)

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

2 个答案:

答案 0 :(得分:1)

@cularis真的应该得到这个功劳,因为他在我有机会将其作为答案发布之前将其作为评论(仅仅)发布。

显然

pgrep bash | wc -l

不会创建新的bash进程;它可以直接从原始bash过程中调用pgrep bashwc -l

但是

echo `pgrep bash | wc -l`
由于管道,

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

尝试

pgrep bash

echo `pgrep bash | cat`

快速查看bash文档(info bash,第3.5.4节,命令替换)我没有看到任何说明何时创建新进程以及何时没有。

答案 1 :(得分:0)

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