Đúng. 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)
Các phương thức này sẽ trả về stdout và chuyển hướng stderr đến 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 thức này trả về true
nếu lệnh thành công. Nó chuyển hướng tất cả đầu ra đến 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.
Điều đó thay thế quy trình hiện tại bằng quy trình được tạo 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 thức này không đợi quá trình thoát 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 thức này sẽ trả về một IO
đối tượng đánh giá lại đầu vào / đầu ra của quy trình mới. Đây cũng là cách duy nhất tôi biết để cung cấp đầu vào cho chương trình.
f. Sử dụng Open3
(trên 1.9.2 trở lên)
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 cung cấp cho bạn quyền truy cập vào stderr.