Ruby 从外部命令获取ANSI彩色输出
我正在为运行PHP单元测试的Ruby 从外部命令获取ANSI彩色输出,ruby,ansi-colors,Ruby,Ansi Colors,我正在为运行PHP单元测试的watchr编写一个小脚本 当前脚本使用system()运行测试,并以彩色显示它们 我试图添加libnotify功能,但为此我需要解析输出并与regexp匹配,这样通知将显示绿色或红色 system()不返回输出,%x确实返回,但是put p不显示颜色,我需要快速查看哪个测试失败。一个选项是运行两次测试—一次用于在终端窗口中显示,第二次用于检查要显示的通知,但我宁愿避免它。put确实显示颜色。问题是当您使用%x运行时,您的PHP测试运行程序很可能会关闭彩色输出,因为它
watchr
编写一个小脚本
当前脚本使用system()
运行测试,并以彩色显示它们
我试图添加libnotify
功能,但为此我需要解析输出并与regexp匹配,这样通知将显示绿色或红色
system()
不返回输出,%x
确实返回,但是put p
不显示颜色,我需要快速查看哪个测试失败。一个选项是运行两次测试—一次用于在终端窗口中显示,第二次用于检查要显示的通知,但我宁愿避免它。put
确实显示颜色。问题是当您使用%x
运行时,您的PHP测试运行程序很可能会关闭彩色输出,因为它认为它没有在终端下运行
如果您在shell中运行run_php_test | less
,也会发生同样的情况。要修复它,您需要在PHP测试运行程序上强制执行彩色输出
编辑
使用pty
运行子流程的最简单方法:
require 'pty'
puts PTY.spawn('run_php_test')[0].read
有没有办法欺骗外部命令,使其认为它是在支持颜色的终端下运行的?我检查了TestRunner的选项-没有办法强制彩色输出。如果有办法让它在关闭着色的情况下运行,应该有办法打开它,对吗?因此,在测试运行程序代码的某个地方,它正在打开或关闭着色。也许它没有直接的命令行开关,但是在那里的某个地方有它的代码。也许你可以用猴子修补它。但是,如果这不是一个选项,您可以尝试ruby中的
pty
库。它在虚拟终端中运行进程。参见此处的方法#7: