Ja. Es gibt mehrere Möglichkeiten:
a. Verwenden %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 werden die stdout zurück und stderr an das Programm des leiten.
b. Verwendung system
:
system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil
Diese Methode liefert true
, wenn der Befehl erfolgreich war. Es leitet alle Ausgaben an die Programme um.
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.
, dass der aktuelle Prozess mit dem durch den Befehl erstellt ersetzt.
d. (Rubin 1.9) verwendet spawn
:
spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".
Diese Methode ist nicht für den Prozess zu beenden nicht warten, und gibt die PID.
e. Verwenden 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 wird ein IO
Objekt zurück, das die neuen Prozesse Eingabe/Ausgabe reperesents. Es ist derzeit auch die einzige mir bekannte Art, dem Programm Input zu geben.
f. Verwenden Sie Open3
(am 1.9.2 und höher)
require 'open3'
stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.successful?
puts stdout
else
STDERR.puts "OH NO!"
end
Open3
hat mehrere andere Funktionen für expliziten Zugriff auf die beiden Ausgangsströme zu bekommen. Es ist vergleichbar mit popen, gibt Ihnen aber Zugriff auf stderr.
Popen auch nur Standard hat, wenn Ihre Anwendung funktioniert. Wenn Sie mehr Interaktion benötigen oder mit stdout, stdin und besonders stderr etwas anderes machen wollen, sollten Sie auch in open3 nachsehen: http://ruby-doc.org/core/classes/Open3.html –