2012-01-04 118 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