有时候需要跑数据,我们希望在控制台输出进度状态,我一般都是这么搞的
loading...............done.
loading..........................................................................................done.
但是像 wget 这类软件的打印信息是这样的
$ wget http://bar.com/foo.zip
[ <=================> ] 83% 530K/s in 0.05s
<=================> 是会变化,但是还是在同一个地方 83% 这处也是的
谁知道怎么搞这个?
print "|==== |\r"
$stdout.flush
sleep 2
print "|====== |\r"
$stdout.flush
sleep 2
print "|=============|\n"
除了\r回行首然后覆盖掉,也可以用 ANSI terminal 的 Cursor Control http://www.termsys.demon.co.uk/vtansi.htm
print "10%\e[3D12%"
\e[3D
就是回退 3 格
Ruby 可以直接用 gem progressbar https://github.com/peleteiro/progressbar/blob/master/lib/progressbar.rb
就是用\r实现的,做爬虫的时候写过一个带进度条的 each:
class Array
def each_with_process
start = Time.now
each_with_index do |item, index|
yield(item)
count = index + 1
avg = (Time.now - start) * 1.0 / (index + 1)
eta = ((size - count) * avg) / 60
printf "\r%.2f %%, %d / %d, AVG: %f sec, ETA: %.0f min, PASSED: %d min ... ", count * 100.0 / size, count, size, avg, eta, (Time.now - start) / 60
end
end
end
100.times do |i|
print ("="*i).ljust(100) + "#{i}%\r"
$stdout.flush
sleep 1
end
来一个无关的 =。= --> https://gist.github.com/1261488
proc do |line|
(1..line).each do |num|
puts "#{' '*(line - num)}#{('1'*num).to_i**2}"
end
end.call((ARGV[0] || 36).to_i)
#15 楼 @huacnlee @jinleileiking 我用的这个https://github.com/busyloop/lolcat,只是为了一个彩虹式的展现效果~