Да. Есть несколько способов:
а. Используйте %x
или '' ':
%x(echo hi)
%x(echo hi >&2)
`echo hi`
`echo hi >&2`
Эти методы вернут stdout и перенаправят stderr в файл программы.
б. Использование system
:
system 'echo hi'
system 'echo hi >&2'
system 'exit 1'
Этот метод возвращается, true
если команда была успешной. Он перенаправляет весь вывод в программу.
c. Использование exec
:
fork { exec 'sleep 60' }
exec 'echo hi'
Это заменяет текущий процесс тем, который был создан командой.
d. (рубин 1.9) используйте spawn
:
spawn 'sleep 1; echo one'
spawn 'echo two'
sleep 2
Этот метод не ожидает завершения процесса и возвращает PID.
е. Использование IO.popen
:
io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
Этот метод вернет IO
объект, который повторяет ввод / вывод новых процессов. Кроме того, в настоящее время это единственный известный мне способ ввести программу.
f. Использовать Open3
(в 1.9.2 и новее)
require 'open3'
stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.successful?
puts stdout
else
STDERR.puts "OH NO!"
end
Open3
имеет несколько других функций для получения явного доступа к двум выходным потокам. Он похож на popen, но дает вам доступ к stderr.