为什么此grep命令不起作用?


24

当我尝试以这种方式使用grep时:

service --status-all | grep network

即使我通过管道将grep其限制为仅将其限制为“网络”字符串,它仍然列出所有服务


事实之后:

注意到本文解释了为什么命令以这种方式运行,这就是我喜欢linux的原因,总有一个很好的理由,但不一定是直观的

Answers:


41

尝试:

service --status-all |& grep network

命令行应用程序可以打印到两个文本流,称为标准输出(stdout)和标准错误(stderr)。默认情况下,终端只显示两个的输出相同。

stdout是给出的数字1,和stderr被赋予数字2默认情况下,重定向操作符,比如>|以及<仅适用于标准输出,1号。

|&将stdout和stderr一起传送到右侧标准输入(stdin)流上的进程,这可以grep按预期进行工作。

我不知道为什么service --status-all在这里打印到stderr,但是总的来说,拥有一个单独的stderr流非常有用,因为即使在stdout静音的情况下,它也可以让您看到错误。


感谢您的回答,这似乎引起了很多兴趣。所以我想我不是唯一一个遇到这个问题的人。
Meer Borg

4

您需要将标准错误流2)重定向到标准输出1):

service --status-all 2>&1 | grep network

操作员>通常会重定向到文件(例如2>/tmp/file)。要使用描述符重定向到其他流,需要在其前面加上&(注意字符之间没有空格)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.