为什么这个 grep 命令不起作用?

为什么这个 grep 命令不起作用?

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

service --status-all | grep network

尽管我将其grep限制为仅“网络”字符串,但它仍然列出了所有服务


事后:

注意到了这一点文章这解释了为什么命令会这样运行,这就是我喜欢 Linux 的原因,总是有一个很好的理由,但不一定是直观的

答案1

尝试:

service --status-all |& grep network

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

Stdout 被赋予编号 1,而 stderr 被赋予编号 2。默认情况下,重定向操作符(例如>|和 )<仅适用于 stdout(编号 1)。

|&将 stdout 和 stderr 一起通过管道传输到右侧标准输入 (stdin) 流上的进程,从而使grep工作按预期进行。

我不知道为什么service --status-all这里要打印到 stderr,但一般来说,拥有单独的 stderr 流非常有用,因为即使 stdout 处于静音状态,它也能让你看到错误。

答案2

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

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

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

相关内容