スクリプトが画面全体をクリアするため、点滅が発生します。既存のテキストを上書きし、必要な場合にのみクリアすると、ちらつきは発生しません。
次に例を示します。
#!/bin/sh
watchit() {
HOME=$(tput cup 0 0)
ED=$(tput ed)
EL=$(tput el)
ROWS=$(tput lines)
COLS=$(tput cols)
printf '%s%s' "$HOME" "$ED"
while true
do
CMD="$@"
${SHELL:=sh} -c "$CMD" | head -n $ROWS | while IFS= read LINE; do
printf '%-*.*s%s\n' $COLS $COLS "$LINE" "$EL"
done
printf '%s%s' "$ED" "$HOME"
sleep 1
done
}
watchit top -b -n 1
これを行います:
- 画面に収まる特定のコマンドからの出力を印刷します(折り返しもスクロールもありません)。
- 既存の行を上書きし、上書きされない各行の部分をクリアします
ed端末の機能を使用して、現在の場所から画面の最後まで印刷します。
サイズ変更可能な画面を処理したい場合は、割り当てを外側のループの内部ROWSやCOLS内部に移動できます。たとえば、
#!/bin/sh
watchit() {
HOME=$(tput cup 0 0)
ED=$(tput ed)
EL=$(tput el)
printf '%s%s' "$HOME" "$ED"
while true
do
ROWS=$(tput lines)
COLS=$(tput cols)
CMD="$@"
${SHELL:=sh} -c "$CMD" | head -n $ROWS | while IFS= read LINE; do
printf '%-*.*s%s\n' $COLS $COLS "$LINE" "$EL"
done
printf '%s%s' "$ED" "$HOME"
sleep 1
done
}
watchit top -b -n 1
ためには、tputシステムから現在のスクリーンサイズを要求します。
参考文献:
clear | hexdump -Cか?