从Ruby运行命令显示并捕获输出

从Ruby运行命令显示并捕获输出,ruby,Ruby,是否有某种方法可以从Ruby运行(shell)命令来显示并捕获输出?也许需要一些宝石的帮助 我所说的显示不是在最后打印它,而是在它出现时打印,这样用户就可以在运行慢速命令时得到关于发生了什么的反馈。您可以像这样运行系统调用: `sleep --help` system("ruby", "-e 100.times{|i| p i; sleep 1}", out: $stdout, err: :out) 还是像这样 system "sleep --help" 或 在系统的情况下,它将打印输出并

是否有某种方法可以从Ruby运行(shell)命令来显示并捕获输出?也许需要一些宝石的帮助


我所说的显示不是在最后打印它,而是在它出现时打印,这样用户就可以在运行慢速命令时得到关于发生了什么的反馈。

您可以像这样运行系统调用:

`sleep --help`
system("ruby", "-e 100.times{|i| p i; sleep 1}", out: $stdout, err: :out)
还是像这样

system "sleep --help"

系统
的情况下,它将打印输出并返回
true
nil
,其他两种方法将返回输出

PS哦。它是关于实时显示的

所以。您可以使用以下内容:

`sleep --help`
system("ruby", "-e 100.times{|i| p i; sleep 1}", out: $stdout, err: :out)
要实时打印数据并将其存储在变量中,请执行以下操作:

output = []
r, io = IO.pipe
fork do
  system("ruby", "-e 3.times{|i| p i; sleep 1}", out: io, err: :out)
end
io.close
r.each_line{|l| puts l; output << l.chomp}
#=> 0
#=> 1
#=> 2
p output
#=> ['0', '1', '2']

您可以重定向输出

system 'uptime > results.log'
或者保存结果

result = `uptime`
result = %x[uptime]

看。获取进度信息或更复杂,我怀疑是否有简单的解决方案。也许这是可能的与先进的,如。您还可以尝试使用and。

我使用了
open3
从ruby代码捕获已执行shell命令的输出

require 'open3'

stdout, stdeerr, status = Open3.capture3("ls")

puts stdout

如果您愿意探索标准库之外的解决方案,您还可以使用流式输出和捕获:

require 'mixlib/shellout'
cmd = 'while true; do date; sleep 2; done'
so = Mixlib::ShellOut.new(cmd)
so.live_stream = $stdout
so.run_command
out = so.stdout

我知道那些运行命令的方法,没有一种方法可以将输出捕获到字符串中并同时输出。我看不到任何
系统
的变体,它可以提取
错误
参数?这是Ruby 2.0吗?@Matthias对于旧Ruby你需要=>(“hash rocket”)符号,所以:,out:io,err::out变成,:out=>io,:err=>:outsystem(“Ruby”,“-e3.times{i | pi;sleep 1},:out=>io,:err=>:out)不工作:in`system”:无法将哈希转换为字符串(TypeError)系统,没有out:,err:,很好!谢谢帮助了我。只需添加以下行,
将结果放入
。这将在控制台中显示结果。这应该是可接受的答案!它为您提供了“结果”,您可以使用它,并且它是标准库的一部分。+80应该可以做到这一点:)