在Ruby中如何返回"system"命令的输出?

12
我需要从 Ruby 脚本中执行一个 shell 命令,但是我需要检索输出结果,以便稍后在脚本中使用它。
这是我的代码:
output = system "heroku create" # => true

但是 system 命令返回的是布尔值而不是输出结果。

简单来说,system "heroku create" 必须向我的屏幕输出结果(它确实这样做了),同时也要返回输出结果,以便我可以处理它。


请参见 https://dev59.com/mXRB5IYBdhLWcg3wNk53。 - weakish
3个回答

15

它和 %x("heroku create") 是一样的吗? - never_had_a_name
根据手册,“内置语法%x{...}使用此方法。” - NullUserException

9

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文档获取更详细的信息。
编辑:增加了额外的流关闭细节。感谢Christopher和Gregory。

1
你不需要 close 吗?我正在查找文档,但没有一个例子表明你是否必须关闭流(对不起:我的编程背景是 Python,C# 和 C++,这些都要求你使用另一种语法或手动关闭流)。 - Chris Pfohl
1
你是对的,@ChristopherPfohl:从文档中可以看到,stdin/out/err.close # stdin、stdout和stderr应该在这种形式中显式关闭。。但是,你也可以使用块形式,它会自动关闭。 - gregoltsov

0
你可以使用以下内容:
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提供。

查看该库的代码注释,capture将被弃用,因此不确定当前支持的方法名称是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接