2016-01-20 73 views
2

Ruby有很多方法来运行系统命令,无论是system()或exec()或反引号等等。如何在捕获输出时执行打印颜色的系统命令,但也可以在Ruby中取消?

但是,我一直在发现只有system和exec(尽可能我知道)能够打印我的一些命令的彩色输出,同时还提供了一个允许我取消命令的PID。

是否有任何其他方式从Ruby命令行脚本运行系统命令,以便我能够满足以下要求?

  1. 见的彩色输出(带组织帮助)
  2. 捕捉输出到一个变量
  3. 得到一个PID,所以如果我需要(我已经有这个代码,我可以取消执行,我只需要PID)
+0

也许Process.spawn并传入IO重定向?我见过Foreman在日志聚合过程中为每个pid的服务器名称预先设置了所有输出日志https://github.com/ddollar/foreman/blob/master/lib/foreman/process.rb#L54 –

+1

至于彩色输出,Ruby根本不会过滤输出。如果输出包含ANSI颜色代码并且您捕获输出,您将获得它们。 –

+0

你应该可以用Ctrl + C来取消脚本。 – AMACB

回答

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和不取消我的Ruby代码从终端控制-C平命令,并且也打印前处理线,如果我想。

0

另一个类似的解决方案是使用$stdout全球为:

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

+0

在我的环境中这不起作用(着色失效):Mac OSX el capitan,bash,iTerm2和Ruby 2.0.0。 – philant

相关问题