跑步时
top -n1 | head
终端的光标消失。跑步top -n1
会把它带回来。
在 Ubuntu 16.04 和 CentOS 7.5 中gnome-terminal
测试。tilix
运行top -n1 | tail
没有这个问题,所以我认为,输出末尾的一些东西让光标重新出现,这在打印唯一top
时没有执行。head
是什么原因造成的,我怎样才能更优雅地取回光标?
跑步时
top -n1 | head
终端的光标消失。跑步top -n1
会把它带回来。
在 Ubuntu 16.04 和 CentOS 7.5 中gnome-terminal
测试。tilix
运行top -n1 | tail
没有这个问题,所以我认为,输出末尾的一些东西让光标重新出现,这在打印唯一top
时没有执行。head
是什么原因造成的,我怎样才能更优雅地取回光标?
恕我直言,最好的方法是
top
使用“批处理”模式(-b
标志),该模式旨在用于非交互式用例,例如管道到另一个程序或文件。所以这
不会在没有光标的情况下离开外壳。
至于为什么光标消失了......
由于
top
是一个交互式程序,它与终端“混淆”以获取输入、滚动内容等,并隐藏光标。终止时,它必须恢复被调用前的光标和显示状态,它通过向终端本身发送一个或多个控制代码来实现。
通过管道传递命令
head
,此控制代码将无法通过(head
默认情况下仅打印前 10 行,并且两者的输出top
以及用于恢复终端状态的控制代码始终 > 10 行)。事实上,如果你给
head
了足够多的行来打印,光标就会出现!例如,
在我的系统上留下一个光标。
我无法在任何地方重新创建这种行为,但它确实出现在 Ubuntu 18.04
检查顶部输出的十六进制转储是有益的:
特别是,开头的序列
0x1b5b3f
是ANSI 转义序列,它们实际上是元数据,用于控制光标位置和文本颜色等内容。特别是,在顶部输出的第一行的开头,有
ESC [?25l
,而在最后一行的末尾是ESC [?25h
。根据维基百科页面,这些是隐藏和显示光标的相应代码。通过将
top -n1
输出传送到head
,终端将在开始时收到 hide-cursor 命令,但在结束时不会收到 show-cursor 命令,因此光标将保持不可见,直到某些其他操作再次将其打开。@MrShunz 建议使用该
-b
选项top
是正确的。此选项禁用 top 输出中的所有 ANSI 转义序列,而只是输出纯 ASCII 可打印文本。top
在执行with期间不会损坏游标-b
: