2012-01-04 3 views
6

Я хочу, чтобы иметь возможность передавать поток дочернего процесса в RubyПоток продукции дочернего процесса в рубине

например.

p `ping google.com` 

Я хочу немедленно увидеть ответы пинга; Я не хочу ждать завершения процесса.

+2

Почему downvote? Это похоже на правильный вопрос. – coreyward

ответ

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

Ну, Дилан Марков, по-видимому, избил меня до удара, но я оставлю это просто, чтобы показать альтернативный метод повторения результатов (используя 'each' versus' while'). – coreyward

+2

Не забудьте «popen3», если вы хотите захватить «STDERR». – tadman

+0

thnx @tadman для упоминания popen3! – Zippie

3

Если вы хотите, чтобы захватить как stdout и stderr вы можете использовать popen2e:

require 'open3' 

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