Oui. Il y a plusieurs manières:
a. Utilisez %x
ou '`':
%x(echo hi) #=> "hi\n"
%x(echo hi >&2) #=> "" (prints 'hi' to stderr)
`echo hi` #=> "hi\n"
`echo hi >&2` #=> "" (prints 'hi' to stderr)
Ces méthodes renverront le stdout, et rediriger stderr vers ce programme.
b. utilisation system
:
system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil
Cette méthode retourne true
si la commande a réussi. Il redirige toutes les sorties vers le programme.
c. utilisation 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.
qui remplace le processus actuel avec celui créé par la commande.
d. (Ruby 1.9) utilisent spawn
:
spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".
Cette méthode n'attend pas pour le processus de sortie et retourne le PID.
e. utilisation IO.popen
:
io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.
Cette méthode retourne un objet IO
que reperesents d'entrée/sortie des nouveaux procédés. C'est aussi actuellement la seule façon dont je sais de donner la contribution du programme.
f. Utiliser Open3
(le 1.9.2 et plus tard)
require 'open3'
stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.successful?
puts stdout
else
STDERR.puts "OH NO!"
end
Open3
a plusieurs autres fonctions pour obtenir un accès explicite aux deux flux de sortie. C'est similaire à popen, mais vous donne accès à stderr.
popen fonctionne bien si votre application a juste la sortie standard. Si vous avez besoin de plus d'interaction ou que vous voulez faire quelque chose de différent avec stdout, stdin, et en particulier stderr, vous voudrez aussi regarder dans open3: http://ruby-doc.org/core/classes/Open3.html –