Ruby 从外部命令获取ANSI彩色输出

Ruby 从外部命令获取ANSI彩色输出,ruby,ansi-colors,Ruby,Ansi Colors,我正在为运行PHP单元测试的watchr编写一个小脚本 当前脚本使用system()运行测试,并以彩色显示它们 我试图添加libnotify功能,但为此我需要解析输出并与regexp匹配,这样通知将显示绿色或红色 system()不返回输出,%x确实返回,但是put p不显示颜色,我需要快速查看哪个测试失败。一个选项是运行两次测试—一次用于在终端窗口中显示,第二次用于检查要显示的通知,但我宁愿避免它。put确实显示颜色。问题是当您使用%x运行时,您的PHP测试运行程序很可能会关闭彩色输出,因为它

我正在为运行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: