问题描述
当我尝试以这种方式使用grep时:
service --status-all | grep network
即使我将其通过管道传送到grep
以仅将其限制为”network”字符串,它仍然列出所有服务
After the Fact:
Noticed this article that explains why the command behaves this way, that’s what I like about linux, there is always a good reason, but not necessary intuitive
最佳办法
尝试:
service --status-all |& grep network
命令行应用程序可以打印到两个文本流,称为标准输出(stdout)和标准错误(stderr)。默认情况下,终端只显示两个的输出相同。
Stdout的编号为1,stderr的编号为2。默认情况下,重定向操作符(如>
,|
和<
)仅适用于stdout的编号1。
|&
将stdout和stderr一起输送到右侧标准输入(stdin)流上的进程,这使grep
可以按预期工作。
我不知道为什么service --status-all
在这里打印到stderr,但是总的来说,拥有一个单独的stderr流非常有用,因为即使在stdout静音的情况下,它也可以让您看到错误。
次佳办法
您需要将standard error stream(2
)重定向到standard output(1
):
service --status-all 2>&1 | grep network
操作员>
通常重定向到文件(例如2>/tmp/file
)。要使用descriptor重定向到其他流,需要在其前面加上&
(请注意,字符之间不能有空格)。