如何在Mac OS X的终端中清除之前的输出?

695

我知道clear命令可以“清除”当前屏幕,但它只是通过打印大量的换行来实现 - 被清除的内容只是被滚动了。

有没有一种方法可以完全清除终端中所有以前的输出,以至于即使向上滚动也无法访问它们?


1
你是否曾经找到一种在shell脚本中运作的方法来做这件事? - Zev Eisenberg
13
@ZevEisenberg 我不这么认为。无论如何,现在我认为我根本不需要这个了。我对 Command+K 很满意。 - eonil
@ZevEisenberg 我更新的答案(以及另一个答案)向您展示了如何从脚本中执行它。 - Alok Singhal
请参见 https://apple.stackexchange.com/questions/31872/how-do-i-reset-the-scrollback-in-the-terminal-via-a-shell-command。 - anishpatel
16个回答

1344

手动清除终端:

+K

对于新键盘,使用 Command+K

在shell脚本中清除终端:

/usr/bin/osascript -e 'tell application "System Events" to tell process "Terminal" to keystroke "k" using command down'

9
如果您意外清空了缓冲区,该怎么查看已清空的内容? - Joshua Pinter
7
@JoshPinter,请注意不要不小心按下它。 :) (考虑在所有情况下使用“清除”,除非您需要滚动历史记录实际消失,例如当您要打印时。) - Wildcard
3
很好,你对使用“clear”的建议很有道理。不过我觉得它们的顺序应该反过来。打“clear”似乎比按“Command + K”更具有意图。 - Joshua Pinter
@JoshPinter clear 是一个在所有终端(OS X 的本地“Terminal”,X11 的 xterm,iTerm 等)中都有效的命令。因此,它查看环境变量 TERM 并输出一组适当的字符来清除终端。Command + K 仅在“Terminal”中有效。Terminal 还提供了许多清除终端部分的命令(Command + L 等)。 - Alok Singhal
@JoshPinter,你可以看到clear根据TERM变量执行操作,例如:TERM=xterm clear | hexdumpTERM=tek clear | hexdump。输出是不同的,因此clear输出的字符显然取决于TERM变量。 - Alok Singhal
显示剩余6条评论

128

一种更好的脚本清屏方法...

如果您正在使用OS X终端应用程序(如OP所述),一种更好的方法(感谢Chris Page对《如何通过shell命令重置终端滚动控件》的回答)如下所示:

clear && printf '\e[3J'

更为简洁的方式是(致谢用户 qiuyi):

或者 (参考):

printf '\33c\e[3J'

这个命令不仅可以清空终端屏幕,还可以清空回滚缓冲区。此外,还有其他选项可供选择。详情请参见Chris Page在"How do I reset the scrollback in the terminal via a shell command?"一文中的回答

原始回答

本主题中给出的AppleScript答案有效,但它会产生一个讨厌的副作用:清除任何活动的终端窗口。如果您在一个窗口运行脚本并尝试在另一个窗口中完成工作,则会对此感到惊讶!

通过调整AppleScript,您可以避免这种情况发生,只需清除最前面的屏幕即可(取自MattiSG在"How do I reset the scrollback in the terminal via a shell command?"一文中的回答):

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

...但是当它不是当前窗口时,输出将会堆积直到再次成为当前窗口,这可能不是您想要的。


1
我在.bash_profile中使用了“更好的方法”,这很棒,因为我再也不会在打开新的终端窗口时遇到缓冲区故障了。 - Patrick Roberts
1
这是概念上最正确的答案。qiuyi的答案避免了&&,但牺牲了一些可读性。如果Alok的答案可以扩展到清除运行当前脚本的终端,那就更好了,但这个更简单。 - Zack Morris
1
我无法弄清楚如何使用.inputrc,但是在我的.bash_profile中,这样做可以解决问题:bind '"\C-k": "printf \\\\33c\\\\e[3;\n"' - kortina
这个答案和另一个答案有一些重叠,我总是浪费时间去找出原始的答案,以便不会因为重复的工作而奖励点矿工。在这里,fearless从2014年开始就使用了clear && printf '\e[3J'。正如(可能有点间接)指出的那样,printf '\33c\e[3J'改进来自另一个答案,并且在此处重复编辑。所以我们有了一个答案和一个改进,它们被重复回到原始状态;每个人都可以得到赞! - ruffin
@kortina 谢谢!很棒的技巧!我不知道在 Bash 中可以使用 bind。 - clearlight
显示剩余2条评论

83

仅删除最后一个输出:

+ L

完全清除终端:

+ K


有没有一种方法可以“清除”屏幕,但如果我向上滚动到折叠区域以上,输入仍然存在? - Qasim
1
@Qasim 在Linux下,clear -x可以保留滚动记录,我手头没有Mac来测试。 - Andreas
@Andreas,我刚在macOS Catalina上的Zsh中测试了一下,它确实可以工作。谢谢! - Qasim
对于iTerm2用户,Cmd + Alt + L可以删除最后一行。 - Sridhar Sarnobat
对于iTerm2用户,Cmd + Alt + L可以删除最后一行:https://superuser.com/a/1767681/114723(称为“清除到上一个标记”) - Sridhar Sarnobat

67

华丽的方式是 printf '\33c\e[3J'


11
这是最佳方法。我们应该定义类似于 alias cls='printf "\33c\e[3J"' 的别名。 - mpyw
同样适用于iTerm2。 - Anders Zommarin
3
@LoïcFaure-Lacroix,\33c 执行的相当于 clear 命令,它基本上只是将屏幕滚动到你无法看到其先前内容。它清除了屏幕,但不清除滚动缓冲区(即您仍然可以使用滚动条查看旧输出)。添加 \e[3J 以实际清除滚动缓冲区。 - luiss
@EirNym,在~/.profile(或系统范围的/etc/profile)中添加function cls { printf '\33c\e[3J\33c' }行。这应该适用于macOS、FreeBSD、Linux等桌面环境。请注意,额外的\33c是为了清除非macOS中的额外\e[3J文字(基本上对于Linux / FreeBSD,我们只需要printf '\33c')。 - vulcan raven
@luiss \33c 这段代码的含义是什么?在 MacOS 上是否有官方文档列出类似代码的完整含义列表? - Richard
你能做一个类似的魔术技巧,只是清除最后一个命令及其输出吗?(相当于Mac上的⌘L) - undefined

37
将此内容放入您的.bash_profile.bashrc文件中:
function cls {
    osascript -e 'tell application "System Events" to keystroke "k" using command down'
}

这个答案在Big Sur上仍然非常有效!它清除当前终端选项卡的输出(其他窗口/选项卡不会被清除)。 - Philipp

22
在Mac OS X 终端中,这个功能已经内置在终端应用程序的菜单 视图清除滚动区 中(默认是 CMD + K)。因此你可以使用 Apple 的键盘快捷键重新分配它。只需为带有命令“Clear Scrollback”的终端添加一个新的快捷键。(我使用 CMD + L,因为它类似于 Ctrl + L 来清除当前屏幕内容,而不清除缓冲区)。我不确定你如何在脚本中使用它(也许需要使用其他人提到的 AppleScript)。

1
从Yosemite(10.10)开始,终端菜单中不再出现“View->Clear Scrollback”选项。但是,键盘快捷键CMD+K仍然可以使用。 - Nicolas Miari
2
@NicolasMiari 看起来在Yosemite中,清除滚动缓存刚从查看View转移到了编辑Edit - BrainSteel

11

Mac OS X v10.10(Yosemite)中,使用 Option + Command + K 清除 Terminal.app 中的滚动缓存。


9
或者您可以按下Ctrl+L发送一个分页符(ASCII换页符)。虽然技术上只是开始了一个新页面,但这与所有其他方法具有相同的净效果,而且速度更快(当然,除了Apple+K解决方案)。并且,由于这是一个ASCII控制命令,它适用于所有shell。

1
这会清除屏幕,但保留滚动缓冲区。 - George
如果你想使用 cmd + f 作为例子,那么它并不相同。 - bormat
这不是控制台中 Control-L 的工作方式。Shell 将 Control-L(换页符)输入绑定到一个命令上,以某种适当的方式清除屏幕,而不是向终端发送换页符。终端将 FF 视为换行符并将光标向前移动一行。Shell 通常使用 terminfo 查找要发送到终端的字节。通常是 clear=\E[H\E[2J,它将光标移动到起始位置(ESC [ H),并擦除显示(ESC [ 2 J)。这就是在编程时重要性使用 clear 命令而不是硬编码整个序列的原因。 - Chris Page

9
Command + K 可以清除先前的输出。
要清除输入的文本,首先使用 Command + A 跳到左边,然后使用 Control + K 清除指针右侧的文本。
可视化示例: Enter image description here

6
clear && printf '\e[3J'

清除所有内容,它在OS X上也很有效。非常整洁。

太好了,我之前一直使用clear命令,但是当你向上滚动时会留下一些东西。现在不会再有这个问题了! - Pascal Belloncle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接