Перепрошивка происходит потому, что скрипт очищает весь экран. Если он закрашивает существующий текст и очищает только при необходимости, мерцание не будет.
Вот пример:
#!/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?