我正在使用一个程序,该程序在出现问题时输出错误消息,但没有相应地设置其退出状态:退出状态始终为 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 上执行此操作。 )