【问题标题】:Ruby: capture output of system() AND print it in terminalRuby:捕获 system() 的输出并在终端中打印
【发布时间】:2014-12-16 01:55:36
【问题描述】:

我正在尝试运行系统命令 (rspec) 并将其输出打印到终端实时彩色,但我也 想要在字符串中捕获其打印输出以供以后使用。

目前它看起来像这样:

cmd = "rspec #{ARGV.join(' ')}"
system cmd
raw = `#{cmd}`

这可行,但由于 RSpec 需要几秒钟才能完成,因此将该时间加倍并非无关紧要。有什么方法可以让system 调用打印到终端,但也可以捕获其输出?

【问题讨论】:

  • 你试过print raw = `#{cmd}` 吗?
  • 不会以彩色实时打印输出。

标签: ruby shell stdout


【解决方案1】:

原来有一个PTY.spawn 方法与Open3#popen2e 非常相似,但也有颜色。这是我的整个街区:

require 'pty'

raw = ''
PTY.spawn(cmd) do |stdout_err, stdin, pid|
  begin
    while (char = stdout_err.getc)
      raw << char
      print char
    end
  rescue Errno::EIO # always raised when PTY runs out of input
  ensure
    Process.waitpid pid # Wait for PTY to complete before continuing
  end
end

【讨论】:

    【解决方案2】:

    您可能应该使用Open3#popen2e。此方法为 stdin 生成一个流,为 stdout 和 stderr 生成一个流(它们被合并),以及一个等待线程。

    您可以安全地关闭标准输入流并忽略服务员线程。您可以逐块读取合并的 stdout 和 stderr 流。

    【讨论】:

    • 有用,但仍不是彩色
    猜你喜欢
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 2014-05-18
    • 1970-01-01
    • 2013-05-31
    • 2012-07-15
    相关资源
    最近更新 更多