Lors de l'exécution
top -n1 | head
le curseur du terminal disparaît. La course le top -n1
ramène.
Testé dans gnome-terminal
et tilix
dans Ubuntu 16.04 et CentOS 7.5.
L'exécution top -n1 | tail
n'a pas ce problème, donc je pense que quelque chose à la fin de la top
sortie laisse réapparaître le curseur qui n'est pas exécuté lors de l'impression du head
seul.
Qu'est-ce qui cause cela et comment puis-je récupérer le curseur plus élégamment?
terminal
gnome-terminal
top
cursor
pLumo
la source
la source
tput cnorm
. ( via )Réponses:
Je n'ai pas pu recréer ce comportement partout, mais il apparaît sur Ubuntu 18.04
Il est instructif d'examiner les vidages hexadécimaux de la sortie supérieure:
En particulier, les séquences commençant
0x1b5b3f
sont des séquences d'échappement ANSI , qui sont en fait des métadonnées pour contrôler des choses comme la position du curseur et la couleur du texte.En particulier, vers le début de la première ligne de sortie supérieure, il y a
ESC [?25l
, et vers la fin de la dernière ligne estESC [?25h
. Selon la page wikipedia, ce sont les codes respectifs pour masquer et afficher le curseur.En redirigeant la
top -n1
sortie vershead
, le terminal recevra la commande hide-cursor au début, mais pas la commande show-cursor à la fin, et donc le curseur restera invisible jusqu'à ce qu'une autre action le rallume.La suggestion @MrShunz d'utiliser l'
-b
optiontop
est juste. Cette option désactive toutes les séquences d'échappement ANSI dans la sortie de top, au lieu de simplement produire du texte imprimable ASCII simple. Aucun curseur ne sera blessé pendant l'exécution detop
avec-b
:la source
printf \\033[?25l
pour masquer etprintf \\033[?25h
révéler à nouveau le curseur. Les autres séquences d'échappement[H
et[2J
effacer le terminal (comparerclear | xxd
)Le meilleur moyen à mon humble avis est d'
top
utiliser le mode "batch" (-b
indicateur) qui est destiné à être utilisé avec des cas d'utilisation non interactifs tels que la canalisation vers un autre programme ou vers un fichier.Donc ça
ne quittera pas le shell sans curseur.
Quant à la raison pour laquelle le curseur disparaît ...
Puisqu'il
top
s'agit d'un programme interactif, il "s'embrouille" avec le terminal pour saisir des entrées, faire défiler le contenu, etc., et il masque le curseur.Lorsqu'il se termine, il doit restaurer le curseur et l'état d'affichage qu'il a trouvé avant d'être appelé, et il le fait en envoyant un ou plusieurs codes de contrôle au terminal lui-même.
En canalisant la commande
head
, ce code de contrôle ne passera pas (head
imprime uniquement les 10 premières lignes par défaut, et la sortie des deuxtop
et des codes de contrôle pour restaurer l'état du terminal est toujours> 10 lignes).En fait, si vous donnez
head
suffisamment de lignes à imprimer, le curseur apparaît!Par exemple,
laisse un curseur sur mon système.
la source
-b
est la voie à suivre pour moi.