Выполнение команды из Ruby, отображающей и захватившего вывод
Есть ли способ запустить команду (shell) из отображения Ruby, но также и захват вывода? Может быть, с помощью какого-то драгоценного камня?
То, что я имею в виду, показывая, не печатает его в конце, но, как он появляется, пользователь получает обратную связь о том, что происходит при запуске медленных команд.
Ответы
Ответ 1
Вы можете запустить системный вызов следующим образом:
`sleep --help`
Или как это
system "sleep --help"
или
%x{ sleep --help }
В случае system
он будет печатать выходные данные и возвращать true
или nil
, другие два метода возвращают вывод
PS Ох. Речь идет о отображении в режиме реального времени.
Итак. Вы можете использовать что-то вроде этого:
system("ruby", "-e 100.times{|i| p i; sleep 1}", out: $stdout, err: :out)
Чтобы распечатать данные в реальном времени и сохранить их в переменной:
output = []
r, io = IO.pipe
fork do
system("ruby", "-e 3.times{|i| p i; sleep 1}", out: io, err: :out)
end
io.close
r.each_line{|l| puts l; output << l.chomp}
#=> 0
#=> 1
#=> 2
p output
#=> ['0', '1', '2']
Или используйте popen
output = []
IO.popen("ruby -e '3.times{|i| p i; sleep 1}'").each do |line|
p line.chomp
output << line.chomp
end
#=> '0'
#=> '1'
#=> '2'
p output
#=> ['0', '1', '2']
Ответ 2
Вы можете перенаправить вывод
system 'uptime > results.log'
или сохранить результаты.
result = `uptime`
result = %x[uptime]
см. здесь. Получение информации о ходе работы или вывод в режиме реального времени более сложно, я сомневаюсь, что есть простое решение. Возможно, это возможно с помощью расширенных функций управления процессом, таких как Open3.popen3. Вы также можете попытаться использовать псевдотерминал с pty и захватить вывод там.
Ответ 3
Я использовал open3
для захвата вывода исполняемой команды оболочки из ruby-кода.
require 'open3'
stdout, stdeerr, status = Open3.capture3("ls")
puts stdout