我正在定制一个内核为6.4.0的Linux系统,我注意到一个奇怪的问题。当我执行top > a.txt
然后打开一个窗口执行时cat a.txt
,我发现cat a.txt
结果是多次尝试的结果top
,但在其他Linux系统上不会出现这个问题。在其他Linux系统中,该cat
命令仅显示一次命令结果top
。我不知道为什么?
# top > a.txt
# cat a.txt
# ls /usr/bin/top -ltr
lrwxrwxrwx 1 1000 1000 17 Aug 23 02:34 /usr/bin/top -> ../../bin/busybox
添加top type
:
# type top
top is /usr/bin/top
答案1
某些top
实现(例如在 OpenBSD 上,但也可能在某些 Linux 系统上)会检测其输出是发送到终端还是发送到非终端的内容(发送到管道或文件),并根据此更改其行为。如果输出到达终端,该实用程序将处于交互模式,接受用户的输入并定期更新其显示。当输出到其他地方时,则以top
非交互模式运行,并且默认情况下仅输出一“屏幕”结果,然后退出。
Busybox 中包含的实现top
不会执行此操作,即使输出进入文件或管道,也会继续输出屏幕更新。每次更新之前都会有一个清除屏幕的控制字符序列,因此cat
应该显示最终的屏幕更新(除非终端不解释控制字符),而如果您在编辑器中打开文件或使用less
查看其内容,您可能会看到几个连续的屏幕更新。Linux 系统上有时发现procps-ng
的 变体似乎也是这种情况。top
如果您希望 Busyboxtop
仅将单个屏幕的输出输出到文件,请使用
top -n 1 >file
至于为什么确实如此,这只是取决于各种top
实现的开发人员以不同的方式实现了该工具。如果您想了解有关在 Busybox 中实施该实用程序时所采取的决策的更多信息top
,您可能需要在 Busybox 特定的论坛或邮件列表中询问。