如何使用Ruby覆盖shell中的打印行?

时间:2011-02-10 23:00:47

标签: ruby shell

如何使用Ruby覆盖Unix shell中以前打印的行?

假设我想每秒在shell上输出当前时间,但不是每次都将字符串堆叠起来,而是想覆盖以前显示的时间。

3 个答案:

答案 0 :(得分:63)

您可以在行尾使用\r转义序列(下一行将覆盖此行)。按照你的例子:

require 'time'

loop do
  time = Time.now.to_s + "\r"
  print time
  $stdout.flush
  sleep 1
end

答案 1 :(得分:29)

使用行尾的转义序列\r - 它是回车,没有换行符

在大多数unix终端上,这可以做你想要的:下一行将覆盖前一行。

如果线条末尾比前一行短,则可能需要用空格填充行尾。

请注意,这不是特定于Ruby的。这个技巧适用于任何语言!

答案 2 :(得分:1)

这是我刚刚编写的一个示例,它带有一个数组并在需要时输出空格。您可以取消注释速度变量以控制运行时的速度。同时删除另一个睡眠0.2数组中的最后一部分必须为空,才能输出整个数组,仍在修复它。

#@speed = ARGV[0]

strArray = [ "First String there are also things here to backspace", "Second Stringhereare other things too ahdafadsf", "Third String", "Forth String", "Fifth String", "Sixth String", " " ]


#array = [ "/", "-", "|", "|", "-", "\\", " "]

def makeNewLine(array)
    diff = nil
    print array[0], "\r"
    for i in (1..array.count - 1)
        #sleep @speed.to_f
        sleep 0.2
        if array[i].length < array[i - 1].length
             diff = array[i - 1].length - array[i].length
        end
        print array[i]
        diff.times { print " " } if !diff.nil?
        print "\r"
        $stdout.flush

    end
end

20.times { makeNewLine(strArray) }

#20.times { makeNewLine(array)}