Я хочу, чтобы иметь возможность передавать поток дочернего процесса в RubyПоток продукции дочернего процесса в рубине
например.
p `ping google.com`
Я хочу немедленно увидеть ответы пинга; Я не хочу ждать завершения процесса.
Я хочу, чтобы иметь возможность передавать поток дочернего процесса в RubyПоток продукции дочернего процесса в рубине
например.
p `ping google.com`
Я хочу немедленно увидеть ответы пинга; Я не хочу ждать завершения процесса.
Вы должны использовать IO#popen:
IO.popen("ping -c 3 google.com") do |data|
while line = data.gets
puts line
end
end
можно сделать следующие вместо того, чтобы использовать кавычку:
IO.popen('ping google.com') do |io|
io.each { |s| print s }
end
Ура!
Ну, Дилан Марков, по-видимому, избил меня до удара, но я оставлю это просто, чтобы показать альтернативный метод повторения результатов (используя 'each' versus' while'). – coreyward
Не забудьте «popen3», если вы хотите захватить «STDERR». – tadman
thnx @tadman для упоминания popen3! – Zippie
Если вы хотите, чтобы захватить как stdout
и stderr
вы можете использовать popen2e
:
require 'open3'
Open3.popen2e('do something') do |_stdin, stdout_err, _wait_thr|
stdout_err.each { |line| puts line }
end
Почему downvote? Это похоже на правильный вопрос. – coreyward