Ja. Es gibt verschiedene Möglichkeiten:
ein. Verwenden Sie %x
oder '`':
%x(echo hi) #=> "hi\n"
%x(echo hi >&2) #=> "" (prints 'hi' to stderr)
`echo hi` #=> "hi\n"
`echo hi >&2` #=> "" (prints 'hi' to stderr)
Diese Methoden geben das stdout zurück und leiten stderr zum Programm um.
b. Verwendung system
:
system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil
Diese Methode wird zurückgegeben, true
wenn der Befehl erfolgreich war. Es leitet alle Ausgaben an das Programm weiter.
c. Verwendung 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.
Dadurch wird der aktuelle Prozess durch den vom Befehl erstellten ersetzt.
d. (Rubin 1.9) verwenden spawn
:
spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".
Diese Methode wartet nicht auf das Beenden des Prozesses und gibt die PID zurück.
e. Verwendung IO.popen
:
io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.
Diese Methode gibt ein IO
Objekt zurück, das die Eingabe / Ausgabe der neuen Prozesse darstellt. Es ist derzeit auch die einzige mir bekannte Möglichkeit, die Programmeingabe zu geben.
f. Verwenden Sie Open3
(ab 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
verfügt über mehrere andere Funktionen, um expliziten Zugriff auf die beiden Ausgabestreams zu erhalten. Es ist ähnlich wie Popen, gibt Ihnen aber Zugriff auf stderr.