我刚刚遇到wc -l的输出在直接调用或包含在反引号中时有所不同。例如:
pgrep bash | wc -l
将输出1,因为有一个bash进程正在运行。但是将此命令包含在反引号中
echo `pgrep bash | wc -l`
将输出2.我首先想到,反引号会打开一个新的bash进程,但是
echo `pgrep bash`
只找到与上面相同的一个过程。将命令括在$():
中时也是如此echo $(pgrep bash | wc -l)
这也将输出2.有人知道为什么会这样吗?
答案 0 :(得分: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节,命令替换)我没有看到任何说明何时创建新进程以及何时没有。
答案 1 :(得分:0)
感谢您的帮助。我实际上找到了更好的解决方案而不是使用wc -l我应该只使用-c参数,它只打印匹配进程的计数。那么,RTFM又来了。 ; - )