Так. Є кілька способів:
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.