Миготіння відбувається тому, що сценарій очищає весь екран. Якщо він намальовує наявний текст і очищається лише за необхідності, мерехтіння не буде.
Ось приклад:
#!/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?