複数のプログレスバーを作成し、画面全体を消去せずにいつでも更新したいと思います(以前の標準出力コンテンツが画面に残りたい)。
以下を行う必要があります。
- 数行を書く
echo
- 一緒に待つ
sleep
- カーソルを最初の行の先頭に戻します。
- 更新された情報で私の行の一部を上書きします。
- 手順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
どのように動作しますか?
- カーソル位置の保存
tput sc
- 画面上の情報を更新するループを入力してください。
tput ed
正しい結果を得るには、画面の最後まで消去します。- その後、変更されたデータの複数行が記録されます。
echo
sleep 1
更新する前に約1秒待ってください。tput rc
印刷したばかりの行の先頭にカーソルを戻します。- 繰り返し新しい情報で上書きする
答え2
カーソルを1行上に移動しtput cuu1
(または上書きするには上に移動する必要がある数行)、上書きします。
たとえば、
echo -e "foo\nbar"
tput cuu1
tput cuu1
echo -e "baz\nquux"
生産する:
baz
quux