如果我调用一个命令使用内核#系统在Ruby中,我如何得到它的输出?
system("ls")
如果我调用一个命令使用内核#系统在Ruby中,我如何得到它的输出?
system("ls")
当前回答
如果你需要转义参数,在Ruby 1.9 IO中。Popen也接受数组:
p IO.popen(["echo", "it's escaped"]).read
在早期版本中,你可以使用Open3.popen3:
require "open3"
Open3.popen3("echo", "it's escaped") { |i, o| p o.read }
如果你还需要传递stdin,这应该在1.9和1.8中都有效:
out = IO.popen("xxd -p", "r+") { |io|
io.print "xyz"
io.close_write
io.read.chomp
}
p out # "78797a"
其他回答
如果你想使用Kernel#系统将输出重定向到一个文件,你可以这样修改描述符:
以追加模式将stdout和stderr重定向到文件(/tmp/log):
系统(ls状态”,:= > [/ tmp /日志,' '],:呃= > [/ tmp /日志,' '])
对于长时间运行的命令,这将实时存储输出。您还可以使用IO存储输出。管道和重定向它从内核#系统。
puts `date`
puts $?
Mon Mar 7 19:01:15 PST 2016
pid 13093 exit 0
最方便的方法是:
stdout_str, stderr_str, status = Open3.capture3(cmd)
puts "exit status: #{status.exitstatus} stdout: #{stdout_str}"
正如Simon Hürlimann已经解释过的,Open3比反撇号等更安全。
require 'open3'
output = Open3.popen3("ls") { |stdin, stdout, stderr, wait_thr| stdout.read }
注意,块表单将自动关闭stdin, stdout和stderr-否则它们必须显式关闭。
你可以用反勾号:
`ls`