Der Cursor verschwindet, wenn `top -n1 | ausgeführt wird Kopf`

11

Beim Laufen

top -n1 | head

Der Cursor des Terminals verschwindet. Laufen top -n1bringt es zurück.

Getestet in gnome-terminalund tilixin Ubuntu 16.04 und CentOS 7.5.


Beim Ausführen top -n1 | tailtritt dieses Problem nicht auf. Ich denke, am Ende der topAusgabe wird der Cursor erneut angezeigt, was beim Drucken des Cursors nicht ausgeführt wird head.

Was verursacht dies und wie kann ich den Cursor eleganter zurückstellen?

pLumo
quelle
1
Ich kann es auch mit Laufen zurückbekommen tput cnorm. ( via )
pLumo

Antworten:

5

Ich konnte dieses Verhalten nicht überall neu erstellen, aber es wird unter Ubuntu 18.04 angezeigt


Es ist lehrreich, Hex-Dumps der Top-Ausgabe zu untersuchen:

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

Insbesondere sind die Sequenzen ausgehend 0x1b5b3fsind ANSI - Escape - Sequenzen , die effektiv Meta-Daten zu Steuer Dinge wie Cursorposition und Textfarbe sind.

Insbesondere gibt es gegen den Anfang der ersten Zeile der obersten Ausgabe ESC [?25lund gegen Ende der letzten Zeile ESC [?25h. Laut Wikipedia-Seite sind dies die entsprechenden Codes zum Ausblenden und Anzeigen des Cursors.

Durch Weiterleiten der top -n1Ausgabe an headerhält das Terminal zu Beginn den Befehl zum Verstecken des Cursors, am Ende jedoch nicht den Befehl zum Anzeigen des Cursors. Daher bleibt der Cursor unsichtbar, bis eine andere Aktion ihn wieder einschaltet.

@ MrShunz Vorschlag, die -bOption zu verwenden, topist richtig. Diese Option deaktiviert alle ANSI-Escape-Sequenzen in der Ausgabe von top und gibt stattdessen nur druckbaren ASCII-Text aus. Während der Ausführung von topwith werden keine Cursor verletzt -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.
$ 
Digitales Trauma
quelle
Tolle Antwort, danke. Das Verhalten kann reproduziert werden , um den Cursor printf \\033[?25lauszublenden und printf \\033[?25hwieder anzuzeigen. Die anderen Escape-Sequenzen [Hund [2Jlöschen Sie das Terminal (vergleiche clear | xxd)
pLumo
17

IMHO ist es am besten, den top"Batch" -Modus ( -bFlag) zu verwenden, der für nicht interaktive Anwendungsfälle wie das Weiterleiten an ein anderes Programm oder eine Datei verwendet werden soll.

Also das

top -n1 -b | head

verlässt die Shell nicht ohne Cursor.

Wie für die , warum verschwindet der Cursor ...

Da topes sich um ein interaktives Programm handelt, "verwirrt" es das Terminal, um Eingaben zu erfassen, Inhalte zu scrollen usw., und es versteckt den Cursor.

Beim Beenden muss der Cursor und der angezeigte Anzeigestatus wiederhergestellt werden, bevor er aufgerufen wird. Dazu werden ein oder mehrere Steuercodes an das Terminal selbst gesendet.

Durch Weiterleiten des Befehls headkommt dieser Steuercode nicht durch ( headdruckt standardmäßig nur die ersten 10 Zeilen, und die Ausgabe von beiden topund den Steuercodes zum Wiederherstellen des Terminalstatus beträgt immer> 10 Zeilen).

Wenn Sie headgenügend Zeilen zum Drucken angeben, wird der Cursor angezeigt!

Beispielsweise,

top -n1 | head -n 100

hinterlässt einen Cursor auf meinem System.

Herr Shunz
quelle
Vielen Dank für Ihre Antwort. Verwenden -bist der Weg für mich.
pLumo