【问题标题】:Clear a terminal screen for real [closed]清除真实的终端屏幕[关闭]
【发布时间】:2011-07-19 00:47:35
【问题描述】:

在终端上使用clear 命令只会使用户误以为屏幕已被清除……当您使用鼠标滚动时,您仍然可以看到先前命令的输出。当您淹没在文本海啸中时,这会使生活变得困难。

可以在 Internet 上找到的各种解决方案(转义码等)只是 clear 命令已经完成的功能的变体。

那么如何在 Linux 中真正清除终端的内容呢?

【问题讨论】:

  • 我将其归类为“程序员常用的软件工具”(在常见问题解答中提及为有效)。
  • 您真正要问的是“如何清除终端的回滚缓冲区?”它独立于 shell (Bash) 或 Ubuntu。
  • @spiderplant0 可能是因为 AskUbuntu 是这个时候的正确位置。被问到时不存在,所以它作为题外话被关闭了,尽管事实并非如此。
  • 正如@Dennis 所指出的,这是一个更普遍的问题,不仅影响 Ubuntu 或 bash。我会更改主题“真正清除 Ubuntu bash 屏幕”-->“真正清除终端屏幕”
  • 您可以使用许多不同的终端类型来运行 Bash(术语“bash 终端”是没有意义的)。 “清理”并不适用于所有这些 - 有时,最接近的近似值是撕毁纸张和垃圾箱/切碎/燃烧/销毁您不想要的部分。

标签: linux ubuntu terminal gnome-terminal konsole


【解决方案1】:

使用以下命令进行清屏,而不是仅仅添加新行...

printf "\033c"

是的,这是 bash 提示符下的“printf”。

您可能想要定义一个别名...

alias cls='printf "\033c"'

说明

\033 == \x1B == 27 == ESC

所以这变成了<ESC>c,这是用于重置终端的 VT100 转义码。 Here 是关于终端转义码的更多信息。

编辑

这里有一些其他的方法......

printf "\ec" #\e is ESC in bash
echo -en "\ec" #thanks @Jonathon Reinhart.
# -e    Enable interpretation of of backslash escapes
# -n    Do not output a new line

KDE

以上内容在 KDE 控制台(称为 Konsole)上不起作用,但有希望!使用以下命令序列来清除屏幕和回滚缓冲区...

clear && echo -en "\e[3J"

或者也许在 KDE 上使用以下别名...

alias cls='clear && echo -en "\e[3J"'

我从here得到了回滚清除命令。

【讨论】:

  • 这实际上是特定于终端的。 "\033c"ESC c,这是“完全重置 (RIS)”的 VT-XXX 转义序列。如今人们实际使用的几乎所有终端都与 VT 兼容,但如果您发现自己使用的是奇怪的终端,这可能行不通。假设 TERM 设置正确,@vpit3833 的答案更有可能奏效。
  • printf 是一个 Bash 内置函数(它也是一个单独的二进制文件,但内置函数具有优先级,大多数现代 shell 都有 printf)。
  • @SDX2000 好的...我知道您指定了 Ubuntu,并且我认为这些在所有“现代”终端仿真器上的行为都相似。我最初在我的 MAC 终端上进行了测试,它没有在那里重置,但它确实在我的 Centos Linux 上重置了。
  • 几年后 0.02 美元,但我是 CU 的学生。问我的操作系统教授,他说这是一个 ANSI 转义序列的例子:en.wikipedia.org/wiki/ANSI_escape_code 这是一个带内信号的例子。
  • KDE 的解决方案是针对 xterm 和支持 xterm 转义序列的终端的解决方案。 xterm 转义序列的官方列表位于invisible-island.net/xterm/ctlseqs/ctlseqs.html。 (如果您想了解有关终端转义序列的更多信息,请参阅ANSI escape sequence)。
【解决方案2】:

试试reset。它会清除终端屏幕,但可以通过箭头或您拥有的任何键绑定访问之前的命令。

【讨论】:

  • 谢谢!但它清除了包括提示在内的所有内容。请参阅我的答案以获取不这样做的解决方案。
  • @SDX2000 两者都清除提示,然后shell生成一个新的。重置的一个缺点是它似乎有点慢(可能是因为它不仅仅是发出 ESC c),但它更便携。
  • @SDX2000 reset 对于那些由于您杀死某些东西(或 catted 二进制文件)而使您的终端严重损坏并且使您的任期处于损坏状态的情况也很方便。是否曾经进入过提示出现但不输入的状态,并且当您按 Enter 时,新提示会显示在上一个提示旁边而不是在其下方?重置解决了这个问题。这实际上就是我使用它的全部......我从来没有需要/渴望清除我的回滚缓冲区。
  • reset相关的一秒延迟对我来说是无法忍受的。
  • 这应该是默认答案恕我直言。打印的幻数永远不是答案
【解决方案3】:
tput reset

这样就行了!

【讨论】:

【解决方案4】:

我读到的答案都没有在 PuTTY 中起作用,所以我在 this article 上找到了评论:

在您的连接设置中,在“窗口->行为”下,您会找到“系统菜单仅在 ALT 上显示”设置。然后 CTRL + L, ALT, l(就是小写的L)会滚动屏幕然后清除回滚缓冲区。

(与 OP 相关,因为我正在连接到 Ubuntu 服务器,但无论您的服务器运行什么,显然也是相关的。)

【讨论】:

  • @Dennis Williamson 的 3 年评论让我得到了这个答案。
  • 另外,鉴于在 PuTTY 的“窗口”设置中您激活了“系统菜单出现在 ALT-Space 上”,您可以快速执行 CTRL+L 然后 ALT+Space, U 首先清除然后终端窗口会真正重置回滚。
【解决方案5】:

我最喜欢的人类友好命令是:

reset

在 xterm 和 VT100 上测试。它在程序异常终止后也有帮助。 保留命令缓冲区,因此向上箭头将循环显示之前的命令。

【讨论】:

    【解决方案6】:

    以下链接将解释如何使该别名永久化,这样您就不必继续输入它了。

    https://askubuntu.com/questions/17536/how-do-i-create-a-permanent-bash-alias

    这些是该链接中详细说明的步骤。

    1. vim ~/.bashrcgedit ~/.bashrc 或任何你喜欢的文本编辑器
    2. alias cls='printf "\033c"'放在文件底部
    3. 保存并退出
    4. . ~/.bashrc(是的,.~ 之间应该有一个空格)
    5. 现在检查一切是否正常!

    我不相信只是传递这些信息。

    【讨论】:

    • \033c\x1bc 相同,\x1bc\u001bc 相同。所有这三个工作!
    【解决方案7】:

    只是补充一点,clearresetprintf 不会清除 tmux 滚动缓冲区。你需要:clear-history。见link

    【讨论】:

      【解决方案8】:
      1. 清理可见屏幕

         clear 
        
      2. 清屏和清缓冲区

         clear && clear 
        
      3. 清洁和 1 秒延迟

         reset
        
      4. 清洁没有 1 秒延迟

         tput reset
        

      【讨论】:

        【解决方案9】:

        我知道不太支持​​使用打印新行的解决方案,但如果其他方法都失败了,为什么不呢?尤其是在其他人可能能够看到屏幕但无法进行键盘记录的环境中操作时。那么,一种可能的解决方案是以下别名:

        alias c="printf '\r\n%.0s' {1..50}"
        

        然后,要“清除”屏幕的当前内容(或者更确切地说,隐藏它们),只需在终端输入 c+Enter

        【讨论】:

          【解决方案10】:

          使用 KDE 和 Ubuntu 12.04 LTS 以及“Konsole”终端,发布的答案均无效。但是,按默认键盘快捷键 CTRL+Shift+X 确实有效!来源:

          https://bugs.kde.org/show_bug.cgi?id=288913

          【讨论】:

          【解决方案11】:
          echo -e "\e[3J"
          

          这适用于 Linux 机器

          【讨论】:

          • 虽然我们感谢您的回答,但如果它在其他答案之上提供额外的价值会更好。在这种情况下,您的答案不会提供额外的价值,因为另一个用户已经发布了该解决方案。如果之前的答案对您有帮助,您应该投票而不是重复相同的信息。
          【解决方案12】:

          编译这个应用程序。

          #include <iostream>
          #include <cstring>
          
          int main()
          {
            char str[1000];
            memset(str, '\n', 999);
            str[999] = 0;
            std::cout << str << std::endl;
            return 0;
          }
          

          【讨论】:

          • 抱歉,这不是最好的解决方案。有比喷 999 行换行更好的方法
          • 这实际上有一些价值。在某些终端中,使用其他方法清除屏幕会终止历史记录,并且不允许您向后滚动……尽管使用 999 行我的手指会感到疲倦。可怜的家伙。
          • @JoshuaDavid 问题的关键在于 OP希望在清除后能够向后滚动。
          • @Socowi 我的评论是针对这个 -50 评分不佳的答案,而不是 OP。但你是对的!
          • 我不敢将其发布为答案,但您可以在 bash 中使用 head -c999 /dev/zero | tr '\0' '\n'yes '' | head -999 执行类似的操作
          猜你喜欢
          • 2012-04-23
          • 2013-07-11
          • 1970-01-01
          • 2011-01-29
          • 2019-10-29
          • 2016-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多