从Ruby运行一个显示和捕获输出的命令

有没有办法从Ruby显示运行(shell)命令,但也捕获输出? 也许在一些gem的帮助下?

我的意思是显示的不是最后打印出来的,而是看起来如此,所以用户得到运行慢速命令时发生了什么的反馈。

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

`sleep --help` 

或者像这样

 system "sleep --help" 

要么

 %x{ sleep --help } 

system情况下,它将打印输出并返回truenil ,其他两种方法将返回输出

PS哦。 这是关于实时显示。

所以。 你可以使用这样的东西:

 system("ruby", "-e 100.times{|i| pi; sleep 1}", out: $stdout, err: :out) 

要实时打印数据并将其存储在variables中:

 output = [] r, io = IO.pipe fork do system("ruby", "-e 3.times{|i| pi; 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'] 

或者使用popen

 output = [] IO.popen("ruby -e '3.times{|i| pi; sleep 1}'").each do |line| p line.chomp output << line.chomp end #=> '0' #=> '1' #=> '2' p output #=> ['0', '1', '2'] 

你可以redirect输出

 system 'uptime > results.log' 

或保存结果。

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

看到这里 。 获取进度信息或实时输出更复杂,我怀疑有一个简单的解决scheme。 也许可以使用先进的进程pipe理function ,如Open3.popen3 。 你也可以试着用pty使用一个伪terminal, 并在那里抓取输出 。

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

 require 'open3' stdout, stdeerr, status = Open3.capture3("ls") puts stdout