如何在不将输出留在终端的情况下退出top?


30

如何获得top与退出方式类似的less退出方式,即不将其输出留在屏幕上?

这是我的版本:

procps-ng version 3.3.9

如何使用类似的替代方法htop呢?
DarkHeart '18

Answers:


48

当您这样启动时...

top && clear

...以q离开顶部后,屏幕将清除。

这更像less

tput smcup ; top ; tput rmcup

smcup切换到top执行命令的辅助屏幕,退出时top rmcup切换回普通屏幕)


您可以为top命令添加别名以执行此操作(如何创建永久的Bash别名?


3
clear似乎也擦除了除了回滚缓冲区的最后一个屏幕以外的所有内容(因此,在这种情况下,只剩下top的最后一个屏幕)-至少在xfce4-terminal和QTerminal中。该tput答案的伟大工程,尤其是在一个别名top
Xen2050

2
不要忘记使用Ctl + L快速修复。
jpaugh

哦,有趣;我想知道为什么less最后的输出从缓冲区中完全消失了。
与莫妮卡(Monica)进行的轻度比赛

其他一些建议:1.使用far-superior-not-in-built-in htop,并且2.将命令别名在一起,因此您不必每次都手动链接它们。
flith

@flith我不会窃取其他用户的答案;-)
Rinzwind

31

讽刺的是1,这是短暂的行为top。在3.3.8中,top确实清除了屏幕,但没有更新过去或之后的版本。请参阅Red Hat Bug#977561

屏幕清除是终端操作更改的间接结果,该更改是Jim Warner(“ top”工具的作者)引入的,目的是抑制某些广泛使用的终端应用程序生成的SIGWINCH信号淹没“ top”工具。是我报告了洪水问题,他尽力解决该问题,并以8次单独提交的形式发布了此问题的修复程序。引入屏幕清除功能的提交具有以下哈希值:“ dedaf6e1a81738ff08ee8e8523871e12f555ad6d”。

由于存在错误报告,Jim随后对其进行了修复,使其不再清除3.3.9中的输出

top没有任何选项或配置设置可以控制此操作,即AFAICT,这完全是硬编码的行为。您可能要在https://gitlab.com/procps-ng/procps/issues/上提交功能请求。

在此之前,您可以clear手动喜欢Rinzwind的建议,也可以tput像steeldriver的建议那样使用。


有趣的是,上面提到的提交对steeldriver建议的命令也有很好的解释,因为它实际上与代码中最初执行的命令相同:

在某些调整大小操作之后,在几个终端仿真器中使用的回滚缓冲区可能给用户带来真正的不便。为了正确渲染top的显示,经常需要额外的击键。

经过大量研究之后,我们发现了两个terminfo字符串,它们具有禁用/还原该织补回滚缓冲区的作用。它们很好地隐藏在字符串标题下(“使用cup开始/结束程序”)。反过来,“ cup”处理tty的光标寻址功能。

只要他们完成工作,我们就不在乎您如何称呼它们或它们指的是什么。这些真的可以!请注意,存在一些副作用,其中一些甚至可以被认为是有益的:

  • enter_ca_mode / smcup / ti禁用回滚缓冲(这很好,这就是我们一直希望的)

  • exit_ca_mode / rmcup / te恢复回滚缓冲区(但也恢复屏幕内容位于pre-top之前)(这与以前的程序最终结果不同)(最后渲染的屏幕保持不变)

...对应于tput smcuptput rmcup命令。


1 必填xkcd。


有趣的是BSD顶部(例如在MacOS上)也确实清除了终端
Digital Trauma

15

您正在寻找的行为从少到多都内置在称为htop的替代方案中。您可以使用以下方法安装它:

sudo apt-get install htop

具体来说,当您关闭htop时,它将在开始保留原始屏幕内容之前切换到备用屏幕模式。与procps的顶部相比,它还具有各种其他增强功能。安装后,您可以以普通用户身份运行它:

htop

加上htop是非常丰富多彩的,对鼠标的支持,等等
WinEunuuchs2Unix

4

您可以使用watch

watch top -b

它默认每两秒钟更新一次,例如-n1,如果要更改此行为,请使用一秒钟。要退出watch,请按Ctrl+ C而不是通常的Q

另一种方法是打开一个新的终端窗口,例如xterm

xterm -e top

这与top通常情况下的行为完全一样,当您退出时该窗口将关闭topQ并且当然不会在您启动该终端的终端中留下任何输出。添加&到此命令的末尾以在后台启动它,然后立即再次释放终端。


1

正如Rinzwind的答案指出的那样,该clear命令清除top了屏幕上的输出。

退出后,top您还可以使用Ctrl+ L清除top屏幕上的输出。但是,在执行任何一条命令之后,您仍然可以向上滚动屏幕以查看旧的top输出。

要真正清除屏幕,使top输出无法回滚,请使用以下reset命令:

top && reset

提供全新会话“新鲜外观”的另一种方法是运行“ ASCII初始屏幕”(如果有的话)。就我而言,我将运行:

top && reset && now && screenfetch

立即重置splash.png

  • 我的now脚本调用了天气,日历(cal)和toilet时间。
  • screenfetch 绘制Ubuntu徽标和计算机统计信息。

1
我不建议您不需要.bashrc 定期重新运行因为通常export PATH=...:$PATH该文件中存在类似的行,并且多次运行它将不必要地扩展PATH。此外,要求neofetch.bashrc不规范的行为(尽管它看起来花哨)。例如,当我重新运行时,.bashrc什么也没发生。
PerlDuck

CTRL + L的clear行为并不相同:请for i in {1..200}; do echo "line $i"; done在两个不同的全新窗口中尝试。然后点击CTRL+Lwindow1并输入clearwindow2。现在在两个窗口(鼠标滚轮)中向后滚动。在- CTRL+L窗口中,您可以看到所有行(取决于您的滚动缓冲区),而在- clear窗口中,您只能向后滚动一个屏幕。也就是说:clear清除回滚缓冲区,而CTRL+L类似于$ window_height按下ENTER(aka newline)的次数。
PerlDuck

1
@PerlDuck neofetch是一个不错的选择,但我猜它是它的派生类screenfetch。我用它来提醒自己我在Ubuntu中,因为我具有双重启动功能,而Windows Bash具有不同的启动屏幕。我将.bashrc参考。至于clearCtrl+ L我的观点是他们都在,他们都离开类似于top在滚动输出后缓冲器。
WinEunuuchs2Unix

2
我认为每个人都有不同的想法.bashrc。试试看curl wttr.in/Edmonton?0,太棒了。使用curl wttr.in/:help得到帮助。我在/etc/update-motd.d/scriptlet中有一个类似的调用,因此从控制台或ssh登录时会得到通知(并非对于每个终端窗口)。如果您愿意,可以添加--silent --max-time 3到curl调用中,这样,如果互联网速度较慢,它就不会永远消失。
PerlDuck

@PerlDuck curl wttr.in/Edmonton?0真棒!非常感谢。在toilet时间显示在我的初始屏幕之后,我将尝试将其压缩:)
WinEunuuchs2Unix
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.