Как переписать ранее напечатанную строку в оболочке Unix с помощью Ruby?
Скажем, я хотел бы выводить текущее время на оболочку каждую секунду, но вместо укладки каждой строки времени я бы хотел перезаписать ранее отображаемое время.
Как переписать ранее напечатанную строку в оболочке Unix с помощью Ruby?
Скажем, я хотел бы выводить текущее время на оболочку каждую секунду, но вместо укладки каждой строки времени я бы хотел перезаписать ранее отображаемое время.
Вы можете использовать escape-последовательность \r
в конце строки (следующая строка перезапишет эту строку). Следуя вашему примеру:
require 'time'
loop do
time = Time.now.to_s + "\r"
print time
$stdout.flush
sleep 1
end
Используйте escape-последовательность \r
в конце строки - это возврат каретки без подачи строки.
На большинстве терминалов unix это сделает то, что вы хотите: следующая строка перезапишет предыдущую строку.
Возможно, вы захотите проложить конец ваших строк пробелами, если они короче предыдущих строк.
Обратите внимание, что это не относится к Ruby. Этот трюк работает на любом языке!
Вот пример, который я только что написал, который берет Array и выводит пробелы, если это необходимо. Вы можете раскомментировать переменную скорости, чтобы контролировать скорость во время выполнения. Также удалите другой сон 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)}