Il cursore scompare quando si esegue `top -n1 | head`


11

Durante la corsa

top -n1 | head

il cursore del terminale scompare. La corsa top -n1lo riporta.

Testato in gnome-terminale tilixin Ubuntu 16.04 e CentOS 7.5.


L'esecuzione top -n1 | tailnon ha questo problema, quindi penso che qualcosa alla fine topdell'output riappaia il cursore che non viene eseguito quando si stampa l' headunico.

Cosa causa questo e come posso ripristinare il cursore in modo più elegante?


1
Posso anche riaverlo con la corsa tput cnorm. ( via )
pLumo,

Risposte:


5

Non sono stato in grado di ricreare questo comportamento ovunque, ma si presenta su Ubuntu 18.04


È istruttivo esaminare i dump esadecimali dell'output superiore:

$ 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
$ 

In particolare, le sequenze che iniziano 0x1b5b3fsono sequenze di escape ANSI , che in realtà sono metadati per controllare cose come la posizione del cursore e il colore del testo.

In particolare, verso l'inizio della prima riga dell'output superiore, c'è ESC [?25l, e verso la fine dell'ultima riga è ESC [?25h. Come per la pagina di Wikipedia, questi sono i rispettivi codici per nascondere e mostrare il cursore.

Effettuando il piping top -n1dell'output a head, il terminale riceverà il comando nascondi cursore all'inizio, ma non il comando mostra cursore alla fine, e quindi il cursore rimarrà invisibile fino a quando qualche altra azione non lo riattiverà nuovamente.

Il suggerimento di @MrShunz di usare l' -bopzione per topè giusto. Questa opzione disabilita tutte le sequenze di escape ANSI nell'output di top, invece emette semplicemente testo stampabile ASCII semplice. Nessun cursore verrà danneggiato durante l'esecuzione di topcon -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.
$ 

Ottima risposta, grazie. Il comportamento può essere riprodotto printf \\033[?25lper nascondere e printf \\033[?25hrivelare nuovamente il cursore. Le altre sequenze di escape [He [2Jsvuota il terminale (confronta clear | xxd)
pLumo

17

Il modo migliore per IMHO consiste topnell'utilizzare la modalità "batch" ( -bflag) che deve essere utilizzata con casi d'uso non interattivi come il piping su un altro programma o su un file.

Così questo

top -n1 -b | head

non lascerà la shell senza un cursore.

Per quanto riguarda il motivo per cui il cursore scompare ...

Dato che topè un programma interattivo, "scherza" con il terminale per afferrare input, scorrere contenuti, ecc. E nasconde il cursore.

Al termine deve ripristinare il cursore e lo stato di visualizzazione che ha trovato prima di essere chiamato, e lo fa inviando uno o più codici di controllo al terminale stesso.

Effettuando il piping del comando head, questo codice di controllo non viene superato ( headstampa solo le prime 10 righe per impostazione predefinita e l'output di entrambi tope dei codici di controllo per ripristinare lo stato del terminale è sempre> 10 righe).

In effetti, se si danno headabbastanza righe per stampare, appare il cursore!

Per esempio,

top -n1 | head -n 100

lascia un cursore sul mio sistema.


Grazie mille per la tua risposta. L'utilizzo -bè la strada da percorrere per me.
pLumo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.