El parpadeo se produce porque el script borra toda la pantalla. Si pinta sobre el texto existente y se borra solo según sea necesario, entonces no habrá parpadeo.
Aquí hay un ejemplo:
#!/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
Hace esto:
- imprime la salida del comando dado que se ajustará en la pantalla (sin ajuste ni desplazamiento)
- escribe sobre las líneas existentes, borrando la parte de cada línea que no se sobrescribe
- usa la
edcapacidad de su terminal para imprimir desde la ubicación actual hasta el final de la pantalla.
Si desea manejar una pantalla de tamaño variable, puede mover las asignaciones hacia ROWSy COLSdentro del bucle externo, por ejemplo,
#!/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 tputpide el tamaño de pantalla actual del sistema.
Otras lecturas:
clear | hexdump -C?