Подтвердить что ты не робот

Выполнение команды из Ruby, отображающей и захватившего вывод

Есть ли способ запустить команду (shell) из отображения Ruby, но также и захват вывода? Может быть, с помощью какого-то драгоценного камня?

То, что я имею в виду, показывая, не печатает его в конце, но, как он появляется, пользователь получает обратную связь о том, что происходит при запуске медленных команд.

4b9b3361

Ответ 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