当运行`top -n1 |时,光标消失。头


11

跑步时

top -n1 | head

终端的光标消失。运行top -n1使它恢复原状。

经测试,在gnome-terminaltilix在Ubuntu 16.04和CentOS 7.5。


运行top -n1 | tail不存在此问题,因此我认为,top输出末尾的某些内容会使光标重新出现,而head仅打印时该光标不会执行。

是什么原因造成的?如何才能更优雅地返回光标?


1
我也可以通过运行恢复它tput cnorm。(通过
pLumo

Answers:


5

我无法在所有地方重新创建此行为,但确实会在Ubuntu 18.04上显示


检查顶部输出的十六进制转储很有帮助:

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

特别是,开始的序列0x1b5b3fANSI转义序列,该序列实际上是元数据,用于控制诸如光标位置和文本颜色之类的内容。

特别是,在top输出的第一行的开始处有ESC [?25l,而在最后一行的结束处是ESC [?25h。根据Wikipedia页面,这些分别是隐藏和显示光标的代码。

通过将top -n1输出传递给head,终端将在开始时接收hide-cursor命令,但在结束时不接收show-cursor命令,因此,光标将保持不可见,直到其他操作再次将其打开为止。

@MrShunz建议使用-b选项top正确。此选项禁用top输出中的所有ANSI转义序列,而仅输出纯ASCII可打印文本。执行topwith 时,不会损害任何游标-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.
$ 

好答案,谢谢。可以重现该行为以printf \\033[?25l再次隐藏和printf \\033[?25h显示光标。其他转义序列[H[2J清除终端(比较clear | xxd
pLumo '18

17

恕我直言,最好的方法是top使用“批处理”模式(-b标志),该模式旨在用于非交互用例,例如管道传输到另一个程序或文件。

所以这

top -n1 -b | head

不会没有光标就离开外壳。

至于为什么光标消失 ...

由于top是交互式程序,因此它与终端“聊天”以获取输入,滚动内容等,并且隐藏光标。

终止时,它必须恢复光标和在调用前找到的显示状态,并且可以通过向终端本身发送一个或多个控制代码来恢复。

通过管道传递命令head,此控制代码将无法通过(head默认情况下仅打印前10行,并且两者的输出top以及用于恢复终端状态的控制代码始终大于10行)。

实际上,如果您提供head足够的行来打印,则会出现光标!

例如,

top -n1 | head -n 100

在系统上留下光标。


非常感谢您的回答。使用-b是我要走的路。
pLumo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.