【发布时间】:2011-04-05 03:15:31
【问题描述】:
我必须从 Ruby 脚本执行一个 shell 命令,但我必须检索输出,以便稍后在脚本中使用它。
这是我的代码:
output = system "heroku create" # => true
但是系统命令返回一个布尔值而不是输出。
简单地说,系统“heroku create”必须输出到我的屏幕(它确实如此),但还要返回输出以便我可以处理它。
【问题讨论】:
标签: ruby
我必须从 Ruby 脚本执行一个 shell 命令,但我必须检索输出,以便稍后在脚本中使用它。
这是我的代码:
output = system "heroku create" # => true
但是系统命令返回一个布尔值而不是输出。
简单地说,系统“heroku create”必须输出到我的屏幕(它确实如此),但还要返回输出以便我可以处理它。
【问题讨论】:
标签: ruby
【讨论】:
%x{…}使用这种方法。”
Open3 库让您可以完全访问标准 IO 流(STDIN、STDOUT 和 STDERR)。 它是 Ruby 的一部分,因此无需安装 gem:
require 'open3'
stdin, stdout, stderr = Open3.popen3("heroku create")
puts stdout.read
stdin.close; stdout.close; stderr.close
或者您可以使用隐式关闭流的块形式:
require 'open3'
Open3.popen3("heroku create") do |stdin, stdout, stderr|
puts stdout.read
end
查看Open3 documentation了解完整详情。
编辑:添加了额外的流关闭细节。感谢 Christopher 和 Gregory。
【讨论】:
close这些吗?我正在寻找有关此的文档,并且没有一个示例显示您是否必须这样做。 (抱歉:python、C#、c++ 背景,所有这些都需要您使用替代语法或手动关闭流)。
stdin/out/err.close # stdin, stdout and stderr should be closed explicitly in this form.。但是,您也可以使用将自动关闭的块形式。
您可以使用以下内容:
output = capture(:stdout) do
system("pwd") # your system command goes here
end
puts output
缩短版:
output = capture(:stdout) { system("pwd") }
同样,我们也可以使用:stderr 捕获标准错误
capture方法由active_support/core_ext/kernel/reporting.rb
提供查看该库的代码 cmets,capture 将被弃用,因此不确定当前支持的方法名称是什么。
【讨论】: