首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby popen3和ANSI颜色

Ruby popen3和ANSI颜色
EN

Stack Overflow用户
提问于 2011-04-03 08:54:56
回答 3查看 1K关注 0票数 6

我正在尝试让watchr在文件更改时自动运行测试,并且得到了我需要的大部分工作,除了来自RSpec的所有ANSI颜色都被忽略的事实。违规代码如下:

代码语言:javascript
复制
stdin, stdout, stderr = Open3.popen3(cmd)
stdout.each_line do |line|
  last_output = line
  puts line
end

当cmd等于类似于rspec spec/**/*.rb的值时,上面的代码可以很好地运行RSpec,只是所有输出都是单色的。我已经考虑改用Kernel.system,但是系统没有返回确定测试是否失败/成功所需的输出。如何从Ruby中执行的包含ANSI颜色的脚本中获得输出,并将其输出到控制台?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-03 09:02:37

我猜rspec正在检查它正在向其写入输出的流,看看它是否是tty (即控制台),如果不是,则禁用颜色。许多命令都可以做到这一点-例如,GNU ls和grep。由于从子进程到脚本的流不是tty,因此颜色将被禁用。

希望rspec有一个标志,它将强制使用颜色,而不考虑流类型。如果没有,你将不得不求助于一些真正奇怪的恶作剧。

票数 6
EN

Stack Overflow用户

发布于 2011-04-03 09:01:10

在决定是否使用颜色输出之前,rspec工具很可能会检查它是在终端上以交互方式运行,还是从脚本自动运行。

The documentation说你可以通过--color命令行选项强制使用颜色。

试试:rspec --color spec/**/*.rb

票数 5
EN

Stack Overflow用户

发布于 2017-11-27 02:54:55

可以通过PTY module在伪终端中运行命令,以便保留面向用户的类似终端的行为。功劳归功于tty-command gem (see this issue)的创建者,他在gem中实现了这种行为:

代码语言:javascript
复制
require 'tty-command'
cmd = TTY::Command.new(pty: true)
cmd.run('rspec', 'spec/**/*.rb')

请记住,使用伪终端可能会产生不想要的副作用,例如某些git命令using a pager,这实际上会导致命令挂起。因此,引入该功能可能是一个突破性的变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5526842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档