Sì. Ci sono diversi modi:
a. Usa %x
o '`':
%x(echo hi) #=> "hi\n"
%x(echo hi >&2) #=> "" (prints 'hi' to stderr)
`echo hi` #=> "hi\n"
`echo hi >&2` #=> "" (prints 'hi' to stderr)
Questi metodi restituire lo stdout, e reindirizzare stderr al programma di.
b. Usa system
:
system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil
Questo metodo restituisce true
se il comando ha avuto successo. Reindirizza tutti gli output a quelli del programma.
c. Usa 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.
che sostituisce il processo corrente con quello creato dal comando.
d. (Ruby 1.9) usa spawn
:
spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".
Questo metodo non aspetta che il processo di uscire e restituisce il PID.
e. Uso IO.popen
:
io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.
Questo metodo restituirà un oggetto IO
che reperesents nuovi processi input/output. Al momento è anche l'unico modo che conosco per fornire l'input del programma.
f. Utilizzare Open3
(in 1.9.2 e successive)
require 'open3'
stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.successful?
puts stdout
else
STDERR.puts "OH NO!"
end
Open3
ha diverse altre funzioni per ottenere l'accesso esplicito ai due flussi in uscita. È simile al popen, ma ti dà accesso a stderr.
popen funziona bene se la vostra applicazione è appena standard out. Se hai bisogno di più interazione o vuoi fare qualcosa di diverso con stdout, stdin e in particolare stderr, ti consigliamo di aprire anche open3: http://ruby-doc.org/core/classes/Open3.html –