从Ruby运行一个显示和捕获输出的命令
有没有办法从Ruby显示运行(shell)命令,但也捕获输出? 也许在一些gem的帮助下?
我的意思是显示的不是最后打印出来的,而是看起来如此,所以用户得到运行慢速命令时发生了什么的反馈。
你可以像这样运行系统调用:
`sleep --help`
或者像这样
system "sleep --help"
要么
%x{ sleep --help }
在system
情况下,它将打印输出并返回true
或nil
,其他两种方法将返回输出
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