हाँ। कई तरीके हैं:
ए। उपयोग करें %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)
ये विधियाँ स्टडआउट लौटाएगी, और प्रोग्राम के लिए स्ट्रीडर पुनर्निर्देशित करेगी।
ख। उपयोग करें system
:
system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil
true
यदि यह आदेश सफल था, तो यह विधि वापस आती है । यह प्रोग्राम के सभी आउटपुट को रीडायरेक्ट करता है।
सी। उपयोग करें 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.
यह वर्तमान प्रक्रिया को कमांड द्वारा बनाई गई एक के साथ बदल देता है।
घ। (रूबी 1.9) का उपयोग करें spawn
:
spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".
यह विधि पीआईडी से बाहर निकलने और वापस आने की प्रक्रिया का इंतजार नहीं करती है।
इ। उपयोग करें IO.popen
:
io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.
यह विधि एक ऐसी IO
वस्तु लौटाएगी जो नई प्रक्रियाओं के इनपुट / आउटपुट को रिप्रेजेंट करती है। यह वर्तमान में भी एकमात्र तरीका है जो मुझे प्रोग्राम इनपुट देने के लिए पता है।
च। उपयोग 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
दो आउटपुट स्ट्रीम में स्पष्ट पहुँच पाने के लिए कई अन्य कार्य हैं। यह पोपेन के समान है, लेकिन आपको stderr तक पहुंच प्रदान करता है।