Unixシェルの以前に印刷された行をRubyで上書きするにはどうすればよいですか?シェルの印刷行をRubyで上書きする方法は?
私は現在の時刻を毎秒シェルで出力したいと思うが、毎回の文字列を積み重ねるのではなく、以前に表示された時刻を上書きしたい。
Unixシェルの以前に印刷された行をRubyで上書きするにはどうすればよいですか?シェルの印刷行をRubyで上書きする方法は?
私は現在の時刻を毎秒シェルで出力したいと思うが、毎回の文字列を積み重ねるのではなく、以前に表示された時刻を上書きしたい。
行末に\r
エスケープシーケンスを使用できます(次の行がこの行を上書きします)。あなたの例を次に示します。
require 'time'
loop do
time = Time.now.to_s + "\r"
print time
$stdout.flush
sleep 1
end
は、行の末尾にエスケープシーケンス\r
を使用してください - それは改行なしキャリッジリターンです。
ほとんどのUNIX端末では、これはあなたが望むことを行います。次の行が前の行を上書きします。
行の末尾が前の行より短い場合は、行末をスペースで埋めたい場合があります。
これはRuby固有のものではありません。このトリックはどんな言語でも機能します!
テキスト出力が現在のターミナルウィンドウよりも広い場合は、出力行の後に行が再び表示されることに注意してください。 –
現在の行が前の行よりも短い問題を回避します。メソッドrjust/ljustでパッドします。 "私の出力" .ljust(80)。 – sunsations
ここでは、書いたばかりの例で、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)}
私は@ jsegalのソリューションがより好きなので、彼の答えを選んでください。あなたの出力をまだフラッシュすることを忘れないでください。 – cam
私はここで分かれています。あなたの答えは、私が正確に尋ねたことのコードの完全な働きのスニペットです:* Ruby *の解決策です。はい、それはjsegalの提案を使用した場合よりエレガントになる可能性があります。しかし、a)jsegalの答えはruby特有ではなく、b)私はむしろ働くスニペットで答えを受け入れることが大です。だから私は先に進み、あなたの答えを編集してjsegalの提案を反映させ、その編集が受け入れられたら、私はあなたの答えを受け入れ、jsegalに投票して報酬を与えるでしょう。このシステムの下で私ができることは最高です。 –
@Steph:あなたのジレンマは、主にjsegalの答えにコードスニペットが含まれていないという事実に基づいているようです。スタックオーバーフローがコード共有サイトではないことを考えると、それはかなり恣意的な要求のようです。あなたが役に立つと分かった場合は、両方の答えをupvoteし、あなたのために働いた解決策を見つけるのに*最も*役に立ったものを受け入れるべきです。 –