特定のステータスを確認し、結果を出力し、短時間スリープしてから、すべてを最初からやり直すためのスクリプトに取り組んでいます。出力は複数の行で構成されており、スクリプトで出力を更新して、同じ行に再度印刷するようにしたいと考えています。Mac と Linux で動作するはずです。これは私がこれまでに持っているものです:
#! /usr/bin/perl
use strict;
print `tput sc`; # Store cursor position
my @lines;
while (1) {
@lines = ();
push(@lines, `tput rc`); # Restore cursor position
push(@lines, `tput ed`); # Clear from cursor to end of screen
push(@lines, `dd if=/dev/urandom bs=1 count=1`); # This is just an example
print @lines;
sleep 1;
}
ターミナル ウィンドウの最後にカーソルを置いてスクリプトを呼び出さない限り、問題なく動作します。後者の場合、カーソルは印刷後にウィンドウの最後にとどまるため、元の位置に戻しても事実上何もせず、次の出力は新しい行に移動します。
どうすればそれを回避できますか?
tput clear
orを呼び出したくありませんtput init
。以前のコマンドと出力が失われる可能性があるためです。出力を開始する前にプロンプトが一番上の行になるようにウィンドウをスクロールすることを考えていましたが、それには現在のカーソル行が必要であり、tput
.
または、印刷された行数を覚えてから、 を使用してカーソルを戻すこともできますtput rin
。ただし、出力が長すぎて 2 つ以上の端末行にまたがって中断された場合、これは機能しません。