Ruby:即使没有换行符,也可以输出外部命令

时间:2014-09-19 17:52:42

标签: ruby shell external-process

我尝试在Ruby中运行外部命令,并解析其输出。

 IO.popen(command, :err=>[:child, :out]) {|ls_io|
  ls_io.each do |line| 
   print line   
 end
 }

这样做的方式可以创造奇迹......除非我解析c程序的进度输出,用\ r显示进度到标准输出。

只要c程序没有输出\ n(只要它没有完成一些长操作),Ruby就会等待并且什么也看不到。然后当输出\ n时,Ruby会看到它全部

1%\r2%\r3%\r…100%
task finished

我尝试了所有调用外部命令的方法(例如Calling shell commands from Ruby);但似乎都没有抓住进展。我也尝试了STDOUT.sync = true这样的每个操作员,而c程序确实调用了fflush(stdout)

我终于找到了一个workaroud。我这样做:

IO.popen(commande, :err=>[:child, :out]) {|ls_io|
while true
  byte=ls_io.read(1)
  if byte.nil?
    break
  end
   print byte
end
}

这很愚蠢......但它确实有效。

更优雅的方式,以及更有效的方式来做到这一点?性能非常糟糕,好像刷新率"很慢。

1 个答案:

答案 0 :(得分:0)

将输入记录分隔符设置为" \ r"在您阻止之前(如果您事先知道):

$/ = "\r"

全局预设变量的参考:http://www.zenspider.com/Languages/Ruby/QuickRef.html#pre-defined-variables