2012-01-04 69 views
6

我希望能够流式传输Ruby中的子进程的输出。Ruby中的子进程的流输出

p `ping google.com` 

我想立即看到ping响应;我不想等待过程完成。

+2

为什么downvote?这看起来像是一个有效的,现实的问题。 – coreyward 2012-01-04 18:55:16

回答

5

你应该使用IO#popen

IO.popen("ping -c 3 google.com") do |data| 
    while line = data.gets 
    puts line 
    end 
end 
9

你可以做以下的,而不是使用反引号:

IO.popen('ping google.com') do |io| 
    io.each { |s| print s } 
end 

干杯!

+1

好吧,Dylan Markow明显地打败了我,但我会留下这只是为了展示迭代结果的替代方法(使用'each'与'while'')。 – coreyward 2012-01-04 19:00:23

+2

如果你想捕捉'STDERR',不要忘记'popen3'。 – tadman 2012-01-04 19:10:54

+0

thnx @tadman提到popen3! – Zippie 2016-06-21 13:57:30

3

如果你想拍摄两个stdoutstderr您可以使用popen2e

require 'open3' 

Open3.popen2e('do something') do |_stdin, stdout_err, _wait_thr| 
    stdout_err.each { |line| puts line } 
end