有没有办法从Ruby显示运行(shell)命令,但也捕获输出?也许借助一些宝石?
我所说的显示不是在最后打印它,而是在它出现时,所以用户得到运行慢命令时发生的事情的反馈.
fl0*_*00r 76
您可以像这样运行系统调用:
`sleep --help`
Run Code Online (Sandbox Code Playgroud)
或者像这样
system "sleep --help"
Run Code Online (Sandbox Code Playgroud)
要么
%x{ sleep --help }
Run Code Online (Sandbox Code Playgroud)
如果system它会打印输出并返回,true或者nil其他两种方法将返回输出
PS哦.它是关于实时显示.
所以.你可以使用这样的东西:
system("ruby", "-e 100.times{|i| p i; sleep 1}", out: $stdout, err: :out)
Run Code Online (Sandbox Code Playgroud)
要实时打印数据并将其存储在变量中:
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']
Run Code Online (Sandbox Code Playgroud)
或者使用 popen
output = []
IO.popen("ruby -e '3.times{|i| p i; sleep 1}'").each do |line|
p line.chomp
output << line.chomp
end
#=> '0'
#=> '1'
#=> '2'
p output
#=> ['0', '1', '2']
Run Code Online (Sandbox Code Playgroud)
0x4*_*672 14
您可以重定向输出
system 'uptime > results.log'
Run Code Online (Sandbox Code Playgroud)
或保存结果.
result = `uptime`
result = %x[uptime]
Run Code Online (Sandbox Code Playgroud)
看到这里.实时获取进度信息或输出更复杂,我怀疑有一个简单的解决方案.也许有可能使用Open3.popen3等高级流程管理功能.你也可以尝试使用伪终端与PTY和虎视眈眈的输出存在.
Kan*_*n S 11
我曾经open3从ruby代码中捕获了执行shell命令的输出.
require 'open3'
stdout, stdeerr, status = Open3.capture3("ls")
puts stdout
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
42439 次 |
| 最近记录: |