【问题标题】:Return output from "system" command in Ruby?从Ruby中的“系统”命令返回输出?
【发布时间】:2011-04-05 03:15:31
【问题描述】:

我必须从 Ruby 脚本执行一个 shell 命令,但我必须检索输出,以便稍后在脚本中使用它。

这是我的代码:

output = system "heroku create" # => true

但是系统命令返回一个布尔值而不是输出。

简单地说,系统“heroku create”必须输出到我的屏幕(它确实如此),但还要返回输出以便我可以处理它。

【问题讨论】:

标签: ruby


【解决方案1】:

你可以使用

output = `heroku create`

见:http://ruby-doc.org/core/classes/Kernel.html

【讨论】:

  • 和 %x("heroku create") 一样吗?
  • @ajsie 根据手册,“内置语法%x{…}使用这种方法。”
【解决方案2】:

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++ 背景,所有这些都需要您使用替代语法或手动关闭流)。
  • 你是对的,@ChristopherPfohl:来自文档,stdin/out/err.close # stdin, stdout and stderr should be closed explicitly in this form.。但是,您也可以使用将自动关闭的块形式。
【解决方案3】:

您可以使用以下内容:

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 将被弃用,因此不确定当前支持的方法名称是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2013-09-14
    • 1970-01-01
    相关资源
    最近更新 更多