Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:即使没有换行符,也可以获得外部命令的输出_Ruby_Shell_External Process - Fatal编程技术网

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%\

我尝试在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%\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"