Cuando se ejecuta
top -n1 | head
el cursor del terminal desaparece. Correr lo top -n1
trae de vuelta.
Probado en gnome-terminal
y tilix
en Ubuntu 16.04 y CentOS 7.5.
La ejecución top -n1 | tail
no tiene este problema, así que creo que algo al final de la top
salida permite que vuelva a aparecer el cursor que no se ejecuta al imprimir el head
único.
¿Qué causa esto y cómo puedo volver el cursor con más elegancia?
terminal
gnome-terminal
top
cursor
pLumo
fuente
fuente
tput cnorm
. ( vía )Respuestas:
No pude recrear este comportamiento en todas partes, pero aparece en Ubuntu 18.04
Es instructivo examinar los volcados hexadecimales de la salida superior:
En particular, las secuencias que comienzan
0x1b5b3f
son secuencias de escape ANSI , que efectivamente son metadatos para controlar cosas como la posición del cursor y el color del texto.En particular, hacia el comienzo de la primera línea de salida superior, hay
ESC [?25l
, y hacia el final de la última línea esESC [?25h
. Según la página de wikipedia, estos son los códigos respectivos para ocultar y mostrar el cursor.Al canalizar la
top -n1
salida ahead
, el terminal recibirá el comando hide-cursor al comienzo, pero no el comando show-cursor al final, y por lo tanto el cursor permanecerá invisible hasta que alguna otra acción lo encienda nuevamente.La sugerencia de @MrShunz para usar la
-b
opcióntop
es correcta. Esta opción deshabilita todas las secuencias de escape ANSI en la salida de la parte superior, en su lugar solo genera un texto imprimible ASCII simple. No se dañarán los cursores durante la ejecución detop
con-b
:fuente
printf \\033[?25l
para ocultar yprintf \\033[?25h
volver a mostrar el cursor. Las otras secuencias de escape[H
y[2J
borrar el terminal (compararclear | xxd
)La mejor manera en mi humilde opinión es hacer
top
uso del modo "por lotes" (-b
bandera) que está destinado a ser utilizado con casos de uso no interactivos, como la canalización a otro programa o un archivo.Así que esto
no dejará el shell sin un cursor.
En cuanto a por qué desaparece el cursor ...
Como
top
es un programa interactivo, se "mete" con el terminal para capturar entradas, desplazar contenido, etc., y oculta el cursor.Al finalizar, debe restaurar el cursor y el estado de visualización que encontró antes de ser llamado, y lo hace enviando uno o más códigos de control al terminal.
Al pasar el comando
head
, este código de control no pasará (head
imprime solo las primeras 10 líneas de forma predeterminada, y la salida de ambostop
y los códigos de control para restaurar el estado del terminal es siempre> 10 líneas).De hecho, si le das
head
suficientes líneas para imprimir, ¡aparece el cursor!Por ejemplo,
deja un cursor en mi sistema.
fuente
-b
es el camino a seguir para mí.