我正在测试应用程序,mycommand
它在控制台和 /tmp/mycommand.log 中都有输出。使用 zsh。mycommand
它实际上是一个带参数的函数,但在控制台中运行时也能得到相同的结果。mycommand
我在浏览器中测试应用程序时运行。完成后,我按 Ctrl+C 完成运行。
程序中可能会发生错误,控制台会输出如下内容:ERROR: Fatal signal! Attach debugger with:
由于我没有查看控制台,日志中也没有显示,我希望在发生这种情况时能够收到通知。我需要的是简单的 声音error
,而不是冗长的应用程序日志输出。
我正在研究如何在解析命令的同时显示命令的输出?但这似乎并不以同样的方式适用于此。
对于 mint/ubuntu,您可以使用
espeak
(apt install espeak
)。该命令很简单:
对于 macos 用户,有一个
say
具有类似功能的本机命令。如果您不想安装任何其他软件包而只对警报声音感到满意,则可以使用铃声
\a
:如果您想要解析命令输出,同时还警告字符串的存在,
ERROR
您可以执行以下操作:从原帖的评论来看,所有输出似乎
mycommand
都会stderr
……也许吧。原帖也澄清了,mycommand
是直接写入日志文件。我假设我们不确定输出是发送到 stdout、stderr 还是混合。
为了演示目的,我将使用以下内容:
一种方法是使用重定向来拆分输出(以监视和后续处理)并
grep
找到我们希望输入的行espeak
:笔记:
mycommand
以将输出发送到 stdout、stderr 还是 stdout/stderr 的混合...ERROR <pause> had a problem
扬声器里ERROR: had a problem
打印出一行字tee /dev/tty
- 确保所有进入 stdout 的数据在通过管道传输到终端之前都被复制到终端grep
2>&1
- 确保所有进入 stderr 的数据都被重定向到 stdout(这意味着 stderr 也通过tee /dev/tty | grep ... | espeak
管道路由)grep
用于提取我们希望传递给的行espeak
;如果要查找多个字符串,您可能需要启用扩展正则表达式支持(例如grep -E ...
)--line-buffered
是一个GNU grep
扩展,确保我们在看到线espeak
的同时听到输出ERROR:
espeak
通过以下方式安装sudo apt install espeak
espeak
OP 可以用他们想要的任何声音产生程序替换当该行包含字符串时,此解决方案(上述)将读出整行
^ERROR:
。如果 OP 希望在行中的任何地方看到
ERROR
该字符串时仅说出单个单词:ERROR
允许
ERROR
在行中任意位置的字符串上进行不区分大小写的匹配,同时仅说出单个单词error
:只说出单词
error
或warning
当字符串ERROR
和/或Warning
行中存在不区分大小写的匹配时:修改
mycommand
输出以下几行:Danger Will Robinson
每当字符串ERROR
或存在不区分大小写的匹配时,以下内容就会发送给扬声器(每个输入行最多一次)warning
:您可以添加一个钩子,在 zsh 启动的程序完成后、打印下一个命令行提示符之前执行,以便对您的进程因错误退出保持敏感:
你可以像 Jesse 推荐的那样,在标准输出中插入管道之类的操作,但这可能会改变程序的行为,而且通常不是你想要的。不过,你可以将 Jesse 的方法与这个方法结合起来。