O piscar ocorre porque o script limpa a tela inteira. Se pintar sobre o texto existente e limpar apenas quando necessário, não haverá tremulação.
Aqui está um exemplo:
#!/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
Faz o seguinte:
- imprime a saída do comando fornecido que se ajustará à tela (sem quebra ou rolagem)
- escreve sobre as linhas existentes, limpando a parte de cada linha que não é substituída
- utiliza a
edcapacidade do seu terminal para imprimir da localização atual até o final da tela.
Se você quiser manipular uma tela redimensionável, poderá mover as atribuições para ROWSe COLSdentro do loop externo, por exemplo,
#!/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
porque tputpede o tamanho da tela atual do sistema.
Leitura adicional:
clear | hexdump -C?