小编Wyz*_*ard的帖子

如何grep程序的输出但也正常回显输出?

我正在使用一个程序,该程序在出现问题时输出错误消息,但没有相应地设置其退出状态:退出状态始终为 0,表示成功。我想从一个 shell 脚本运行这个程序,如果它发出任何错误消息,就得到一个非零的退出状态,这样脚本就可以知道程序失败了。

错误消息遵循我可以匹配的可预测模式grep,并grep根据它是否找到匹配来设置其退出状态,因此我可以将程序的输出通过管道输入grep并否定结果!以获得我想要的退出状态。

问题是,如果我用管道输入grep,我就看不到程序的输出了,因为grep消耗了它。我想以某种方式扫描错误消息的输出,但也要正常显示输出,因为除了错误之外还有其他重要消息。不幸的是,grep没有选项可以传递所有输入、匹配和非匹配行。

我发现有效的一种方法是:

! my_program | tee /dev/stderr | grep -q "error message"
Run Code Online (Sandbox Code Playgroud)

这将程序的输出输入grep但也将其复制到标准错误中,该错误未重定向,因此我可以看到它。当我的脚本的标准输出和标准错误都进入一个终端时,这没问题(所以哪个接收消息并不重要),但是如果标准输出和标准错误被重定向到不同的地方,它可能会导致问题;这些消息最终会出现在错误的地方。

使用bash或 POSIX shell 和 GNU 工具,是否有一种(简洁的)方法来扫描程序的标准输出和/或标准错误流,grep并相应地设置退出状态,但同时也让两个流都到达它们的正常目的地?

(请注意,my_program将其错误消息写入标准输出,而不是标准错误,因此只能扫描标准输出流的解决方案是可以的,但并不理想。如果它有所不同,我将在 CentOS 7 上执行此操作。 )

grep bash pipe io-redirection

7
推荐指数
3
解决办法
1万
查看次数

标签 统计

bash ×1

grep ×1

io-redirection ×1

pipe ×1