Có. Có một số cách:
a. Sử dụng %x
hoặc '`':
%x(echo hi) #=> "hi\n"
%x(echo hi >&2) #=> "" (prints 'hi' to stderr)
`echo hi` #=> "hi\n"
`echo hi >&2` #=> "" (prints 'hi' to stderr)
Những phương pháp này sẽ trả lại stdout, stderr và chuyển hướng tới các chương trình.
b. Sử dụng system
:
system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil
Phương pháp này trả về true
nếu lệnh đã thành công. Nó chuyển hướng tất cả đầu ra của chương trình.
c. Sử dụng 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.
Đó thay thế quá trình hiện với một tạo ra bởi lệnh.
d. (ruby 1.9) sử dụng spawn
:
spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".
Phương pháp này không chờ đợi cho quá trình để thoát ra và trả về PID.
e. Sử dụng IO.popen
:
io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.
Phương pháp này sẽ trả về một đối tượng IO
rằng reperesents các quá trình mới đầu vào/đầu ra. Nó cũng là cách duy nhất tôi biết để cung cấp cho đầu vào chương trình.
f. Sử dụng Open3
(trên 1.9.2 và sau này)
require 'open3'
stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.successful?
puts stdout
else
STDERR.puts "OH NO!"
end
Open3
có một số chức năng khác để truy cập rõ ràng vào hai luồng đầu ra. Nó tương tự như popen, nhưng cho phép bạn truy cập vào stderr.
popen hoạt động tốt nếu ứng dụng của bạn chỉ có chuẩn ra. Nếu bạn cần tương tác nhiều hơn hoặc muốn làm điều gì đó khác với stdout, stdin và đặc biệt là stderr bạn cũng sẽ muốn xem xét trong open3: http://ruby-doc.org/core/classes/Open3.html –