web-dev-qa-db-ja.com

シェルで印刷された行をRubyで上書きする方法は?

Unixシェルで以前に印刷した行をRubyでどのように上書きしますか?

たとえば、シェルで現在の時刻を毎秒出力したいとしますが、時刻の文字列をスタックするのではなく、以前に表示された時刻を上書きしたいとします。

42
Steph Thirion

\r行末のエスケープシーケンス(次の行でこの行が上書きされます)。あなたの例に従ってください:

require 'time'

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

エスケープシーケンスを使用する\r行末-改行のない復帰です。

ほとんどのUNIX端末では、これはあなたが望むことをします:次の行は前の行を上書きします。

前の行より短い場合は、行の終わりにスペースを埋め込むことをお勧めします。

これはRuby固有ではないことに注意してください。このトリックはどの言語でも機能します。

35
jsegal

これは、先ほど書いた、配列を受け取り、必要に応じて空白を出力する例です。実行時の速度を制御するには、speed変数のコメントを外します。また、他のスリープ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)}
1
Saloaty