端末のスクロールバックを失うことなく、コマンドラインから複数行の標準出力を上書きできますか?

端末のスクロールバックを失うことなく、コマンドラインから複数行の標準出力を上書きできますか?

複数のプログレスバーを作成し、画面全体を消去せずにいつでも更新したいと思います(以前の標準出力コンテンツが画面に残りたい)。

以下を行う必要があります。

  1. 数行を書くecho
  2. 一緒に待つsleep
  3. カーソルを最初の行の先頭に戻します。
  4. 更新された情報で私の行の一部を上書きします。
  5. 手順2から繰り返します。

アイデアは、ユーザーが前のstdoutコンテンツを読むために後ろにスクロールできるようにしたいということです。

ロールバックに興味がない場合は、clear必要なものを再利用して作成できます。

while [ true ]; do echo "$SECONDS"; sleep 0.1; clear; done

ただし、clear以前のターミナル出力をビューからプッシュできるだけに改行が印刷されるため、スクロールバックを完全に読み取れなくなります。

実行しhtopて閉じると、ターミナルはhtopを起動したときと同じ状態に復元されます。 bashスクリプトでこのようなことを行うことはできますか?

答え1

tput sc tput edと を使用しますtput rc

~からマニュアル入力:

tput sc

カーソル位置の保存

tput rc

カーソル位置の復元

tput ed

画面の最後まで消去

例:

tput sc
while :; do
    tput ed
    echo -e "$SECONDS\n$SECONDS\n$SECONDS"
    sleep 1
    tput rc
done

どのように動作しますか?

  1. カーソル位置の保存tput sc
  2. 画面上の情報を更新するループを入力してください。
  3. tput ed正しい結果を得るには、画面の最後まで消去します。
  4. その後、変更されたデータの複数行が記録されます。echo
  5. sleep 1更新する前に約1秒待ってください。
  6. tput rc印刷したばかりの行の先頭にカーソルを戻します。
  7. 繰り返し新しい情報で上書きする

答え2

カーソルを1行上に移動しtput cuu1(または上書きするには上に移動する必要がある数行)、上書きします。

たとえば、

echo -e "foo\nbar"
tput cuu1
tput cuu1
echo -e "baz\nquux"

生産する:

baz
quux

関連情報