是。 有几种方法:
一种。 使用Open3或''':
%x(echo hi) #=> "hi\n"
%x(echo hi >&2) #=> "" (prints 'hi' to stderr)
`echo hi` #=> "hi\n"
`echo hi >&2` #=> "" (prints 'hi' to stderr)
这些方法将返回stdout,并将stderr重定向到程序。
湾 使用Open3:
system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil
如果命令成功,此方法返回Open3。 它将所有输出重定向到程序。
C。 使用Open3:
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.
这将使用命令创建的进程替换当前进程。
d。 (ruby 1.9)使用Open3:
spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".
此方法不等待进程退出并返回PID。
即 使用Open3:
io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.
此方法将返回一个Open3对象,该对象表示新进程的输入/输出。 它也是我所知道的唯一提供程序输入的方法。
F。 使用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具有几个其他功能,用于获取对两个输出流的显式访问。 它类似于popen,但可以访问stderr。