Да. Есть несколько способов:
a. Используйте %x
или '`':
%x(echo hi) #=> "hi\n"
%x(echo hi >&2) #=> "" (prints 'hi' to stderr)
`echo hi` #=> "hi\n"
`echo hi >&2` #=> "" (prints 'hi' to stderr)
Эти методы вернут stdout и перенаправят stderr в программу.
b. Использование system
:
system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil
Этот метод возвращает true
, если команда была успешной. Он перенаправляет весь вывод в программу.
c. Использование exec
:
fork { exec 'sleep 60' } # you see a new process in top, "sleep", but no extra ruby process.
exec 'echo hi' # prints 'hi'
# the code will never get here.
Это заменяет текущий процесс созданным командой.
d. (ruby 1.9) используйте spawn
:
spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".
Этот метод не ожидает завершения процесса и возвращает PID.
e. Использование IO.popen
:
io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.
Этот метод возвращает объект 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.