如何在捕获输出时执行以彩色打印的系统命令,但也可以在Ruby中取消?

时间:2016-01-20 04:00:40

标签: ruby terminal

Ruby有很多方法可以运行系统命令,无论是system(),还是exec(),还是反引号等。

但是,我发现只有system和exec(据我所知)能够打印某些命令的彩色输出,同时还提供一个允许我取消命令的PID。 / p>

有没有其他方法可以从Ruby命令行脚本运行系统命令,以便我能够满足以下要求?

  1. 查看彩色输出(帮助组织)
  2. 将输出捕获到变量
  3. 获取一个PID,这样我就可以取消执行(如果需要的话)(我已经有了这个代码,我只需要PID)

2 个答案:

答案 0 :(得分:1)

在搞乱了一段时间之后,我发现IO.popen返回一个包含pid的对象,也可以用来打印所有捕获的输出。它也不会干扰从Ruby内部调用的系统命令的ANSI输出。我的代码现在看起来像这样:

#!/usr/bin/ruby

def shutdown()
    `kill #{$pid}`
end

["INT", "KILL", "TERM"].each { |_sig| Signal.trap(_sig) { shutdown() }     }

process = IO.popen("ls --color ~; ping -c 10 www.google.com")
$pid = process.pid
process.each { |_line| puts _line }

因此我可以取消ls和ping命令而不用终端的control-C取消我的Ruby代码,如果我愿意,也可以在打印之前操作这些行。

答案 1 :(得分:0)

另一个类似的解决方案是使用$stdout全局,如:

$stdout.puts `ls --color ~; ping -c 10 www.google.com`