如何使用Ruby覆盖Unix shell中以前打印的行?
假设我想每秒在shell上输出当前时间,但不是每次都将字符串堆叠起来,而是想覆盖以前显示的时间。
答案 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)}