Ruby:即使没有换行符,也可以获得外部命令的输出
我尝试在Ruby中运行一个外部命令,并解析其输出Ruby:即使没有换行符,也可以获得外部命令的输出,ruby,shell,external-process,Ruby,Shell,External Process,我尝试在Ruby中运行一个外部命令,并解析其输出 IO.popen(command, :err=>[:child, :out]) {|ls_io| ls_io.each do |line| print line end } 这种方法非常有效……除非我解析c程序的进度输出,该程序将其进度显示为stdout with\r 只要c程序没有输出\n(也就是说,只要它没有完成一些长操作),Ruby就会等待,什么也看不到。然后,当输出一个\n时,Ruby会看到所有内容 1%\
IO.popen(command, :err=>[:child, :out]) {|ls_io|
ls_io.each do |line|
print line
end
}
这种方法非常有效……除非我解析c程序的进度输出,该程序将其进度显示为stdout with\r
只要c程序没有输出\n(也就是说,只要它没有完成一些长操作),Ruby就会等待,什么也看不到。然后,当输出一个\n时,Ruby会看到所有内容
1%\r2%\r3%\r…100%
task finished
我尝试了所有调用外部命令的方法(例如);但似乎没有人能抓住这一进展。我还尝试了所有的操作,比如STDOUT.sync=true
,c程序确实调用了fflush(STDOUT)
我终于找到了解决办法。我有:
IO.popen(commande, :err=>[:child, :out]) {|ls_io|
while true
byte=ls_io.read(1)
if byte.nil?
break
end
print byte
end
}
这是愚蠢的…但它是有效的
还有更优雅、更高效的方法吗?性能很差,就好像“刷新率”很慢一样。将输入记录分隔符设置为块前面的“\r”(前提是您事先知道):
全局预设变量的引用:谢谢……不过还有一些\n我想抓住的。我只想接收输出,就像从shell而不是ruby调用命令一样!
$/ = "\r"