Lampu kilat terjadi karena skrip menghapus seluruh layar. Jika melukis di atas teks yang ada dan membersihkan hanya sesuai kebutuhan, maka tidak akan ada berkedip.
Berikut ini sebuah contoh:
#!/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
Ia melakukan ini:
- mencetak output dari perintah yang diberikan yang sesuai pada layar (tidak ada pembungkus atau gulir)
- menulis di atas baris yang ada, membersihkan bagian dari setiap baris yang tidak ditimpa
- menggunakan
edkemampuan terminal Anda untuk mencetak dari lokasi saat ini ke ujung layar.
Jika Anda ingin menangani layar resizable, Anda bisa memindahkan tugas ke ROWSdan COLSdi dalam lingkaran luar, misalnya,
#!/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
karena tputmeminta screensize saat ini dari sistem.
Bacaan lebih lanjut:
clear | hexdump -C?