Le curseur disparaît lors de l'exécution de `top -n1 | tête`

11

Lors de l'exécution

top -n1 | head

le curseur du terminal disparaît. La course le top -n1ramène.

Testé dans gnome-terminalet tilixdans Ubuntu 16.04 et CentOS 7.5.


L'exécution top -n1 | tailn'a pas ce problème, donc je pense que quelque chose à la fin de la topsortie laisse réapparaître le curseur qui n'est pas exécuté lors de l'impression du headseul.

Qu'est-ce qui cause cela et comment puis-je récupérer le curseur plus élégamment?

pLumo
la source
1
Je peux aussi le récupérer en courant tput cnorm. ( via )
pLumo

Réponses:

5

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:

$ top -n1 | head -n1 | xxd
00000000: 1b5b 3f31 681b 3d1b 5b3f 3235 6c1b 5b48  .[?1h.=.[?25l.[H
00000010: 1b5b 324a 1b28 421b 5b6d 746f 7020 2d20  .[2J.(B.[mtop - 
00000020: 3133 3a34 333a 3034 2075 7020 3120 6d69  13:43:04 up 1 mi
00000030: 6e2c 2020 3120 7573 6572 2c20 206c 6f61  n,  1 user,  loa
00000040: 6420 6176 6572 6167 653a 2030 2e38 312c  d average: 0.81,
00000050: 2030 2e35 342c 2030 2e32 321b 2842 1b5b   0.54, 0.22.(B.[
00000060: 6d1b 5b33 393b 3439 6d1b 2842 1b5b 6d1b  m.[39;49m.(B.[m.
00000070: 5b33 393b 3439 6d1b 5b4b 0a              [39;49m.[K.
$ top -n1 | tail -n1 | xxd
00000000: 1b5b 3f31 326c 1b5b 3f32 3568 1b5b 4b    .[?12l.[?25h.[K
$ 

En particulier, les séquences commençant 0x1b5b3fsont 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 est ESC [?25h. Selon la page wikipedia, ce sont les codes respectifs pour masquer et afficher le curseur.

En redirigeant la top -n1sortie vers head, 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' -boption topest 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 de topavec -b:

$ top -b -n1 | head -n1 | xxd
00000000: 746f 7020 2d20 3133 3a35 393a 3236 2075  top - 13:59:26 u
00000010: 7020 3138 206d 696e 2c20 2031 2075 7365  p 18 min,  1 use
00000020: 722c 2020 6c6f 6164 2061 7665 7261 6765  r,  load average
00000030: 3a20 302e 3134 2c20 302e 3036 2c20 302e  : 0.14, 0.06, 0.
00000040: 3037 0a                                  07.
$ 
Traumatisme numérique
la source
Excellente réponse, merci. Le comportement peut être reproduit avec printf \\033[?25lpour masquer et printf \\033[?25hrévéler à nouveau le curseur. Les autres séquences d'échappement [Het [2Jeffacer le terminal (comparer clear | xxd)
pLumo
17

Le meilleur moyen à mon humble avis est d' toputiliser le mode "batch" ( -bindicateur) 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

top -n1 -b | head

ne quittera pas le shell sans curseur.

Quant à la raison pour laquelle le curseur disparaît ...

Puisqu'il tops'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 ( headimprime uniquement les 10 premières lignes par défaut, et la sortie des deux topet des codes de contrôle pour restaurer l'état du terminal est toujours> 10 lignes).

En fait, si vous donnez headsuffisamment de lignes à imprimer, le curseur apparaît!

Par exemple,

top -n1 | head -n 100

laisse un curseur sur mon système.

M. Shunz
la source
Merci beaucoup pour votre réponse. L'utilisation -best la voie à suivre pour moi.
pLumo