将 shell 的所有输出重定向到命令以充当过滤器

将 shell 的所有输出重定向到命令以充当过滤器

如何将所有 std-output 从 bash 重定向到像‘grep’或‘sed’这样的命令来过滤输出然后将其写入文件?

原则上,这就是我想要的:exec > >(cat | cat >>/tmp/myoutput.txt)。最后一个命令按预期工作。但如果我将第一个命令替换catgrep -v 'foo'或 ,sed 's/foo/bar/g'则不会将任何数据写入文件。

如何使上述示例与 grep 或 sed 一起工作?

背景: 我想过滤 .xsession-errors 中的错误消息。但 sed -i 's/foo/bar/g' .xsession-errors 无法正常工作,因为 sed 替换了文件 .xsession-errors,并且程序的未来输出不可见。因此,一个可行的方案是将 /etc/X11/Xsession 中的一行替换为过滤消息的代码。

更多信息请点击这里:

  • 我使用了cat2 次来显示管道在子 shell 中按预期工作,并将所有内容路由到文件中。cat当然,最终版本中不需要它。
  • 我认为我有足够的输出来填充缓冲区,因为我确实多次ls /usr/填充了缓冲区。)
  • exec | sed ...不管用

答案1

例子:

  1. 打开一个 bash
  2. 调用命令exec > >(cat | cat >>/tmp/myoutput.txt)
  3. 调用另一个命令,例如“ls -R /usr”
  4. 结束 bashexit
  5. 查看文件 /tmp/myoutput.txt,您将看到ls命令的输出
  6. 如果你将步骤中的命令与此命令交换exec > >(sed 's/usr/--HEREAMI--/g' >/tmp/myoutput2.txt)

这终于起作用了……
看来,确实是填充缓冲区的问题。几个ls /usr是不够的,但ls -R /usr会填满缓冲区。所以现在我需要弄清楚如何防止缓冲。

(感谢您的评论和请求示例,这带来了解决方案。)

相关内容