ChatGPT解决这个技术问题 Extra ChatGPT

How can I clear previous output in Terminal in Mac OS X?

I know the clear command that 'clears' the current screen, but it does this just by printing lots of newlines - the cleared contents just get scrolled up.

Is there a way to completely wipe all previous output from the terminal so that I can't reach it even by scrolling up?

Did you ever find a way to do this that works in a shell script?
@ZevEisenberg I don't think so. Anyway, now I think I don't need this at all. I am satisfied with Command+K.
@ZevEisenberg my updated answer (and one other answer) shows you how to do it from a script.

N
Nathan Tuggy

To clear the terminal manually:

⌘+K

Command+K for newer keyboards

To clear the terminal from within a shell script;

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

@fearless_fool apple.stackexchange.com/a/31887 might do it? If it does, please let me know!
Well, yes, but see below (stackoverflow.com/a/26615036/558639) for a better way altogether.
If you accidentally pressed this, how would one go about viewing the cleared buffer?
@JoshPinter, just don't press it by accident. :) (Consider using clear for all cases except where you need the scrollback history to actually disappear, e.g. when you are going to print.)
@Wildcard Fair enough. :) Good advice on using clear. I feel like they should be reversed, though. Typing clear seems more intentional than hitting Command + K.
P
Peter Mortensen

A better way to clear the screen from within a script...

If you're using the OS X Terminal app (as stated by the OP), a better approach (thanks to Chris Page's answer to How do I reset the scrollback in the terminal via a shell command?) is just this:

clear && printf '\e[3J'

or more concisely (hat tip to user qiuyi):

printf '\33c\e[3J'

which clears the scrollback buffer as well as the screen. There are other options as well. See Chris Page's answer to How do I reset the scrollback in the terminal via a shell command? for more information.

Original answer

The AppleScript answer given in this thread works, but it has the nasty side effect of clearing any terminal window that happens to be active. This is surprising if you're running the script in one window and trying to get work done in another!

You avoid this by refining the AppleScript to only clear the screen if it is frontmost by doing this (taken from MattiSG's answer to 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'

... but as when it's not the current window, the output will stack up until it becomes current again, which probably isn't what you want.


I used the "better way" in .bash_profile and it's awesome because I no longer get the glitched buffer sometimes when opening a new terminal window.
This is the most conceptually correct answer. qiuyi's answer avoids the && at the sacrifice of a little readability. If Alok's answer could be extended to clear the terminal that is running the current script, it would be an improvement, but this simpler.
Is there a way to bind a command, eg, ctrl+l, to do the same thing as printf '\33c\e[3J' using .inputrc ?
I could not figure out with .inputrc but this worked in my .bash_profile: bind '"\C-k": "printf \\\\33c\\\\e[3;\n"'
The printf code works in the normal terminal app, but not in the built-in terminal of PHPStorm. Anyone knows why?
q
qiuyi

The pretty way is printf '\33c\e[3J'


This is the best way. We should define alias like alias cls='printf "\33c\e[3J"'
Works in iTerm2 as well
@LoïcFaure-Lacroix, \33c performs the equivalent of the clear command, which basically just scrolls the screen until you can't see it's previous contents. It clears the screen, but not the scroll back buffer (i.e. you can still use the scroll bars to see the old output). Add the \e[3J to actually clear the scroll back buffer.
@EirNym, add function cls { printf '\33c\e[3J\33c' } line in ~/.profile (or system-wide /etc/profile). This should work for desktop environments in macOS, FreeBSD, Linux etc. Note the extra \33c is for clearing the extra \e[3J literal in non-macOS (basically for Linux/FreeBSD, we only need printf '\33c').
P
Peter Mortensen

To delete the last output only:

⌘ + L

To clear the terminal completely:

⌘ + K


Is there a way to clear the screen but still have the input be there if I scroll up above the fold?
@Qasim Under Linux clear -x keeps scrollback intact, don't have a mac at hand to test there
@Andreas I just tested it out in Zsh on macOS Catalina, and it does indeed work. Thanks!
P
Peter Mortensen

Put this in your .bash_profile or .bashrc file:

function cls {
    osascript -e 'tell application "System Events" to keystroke "k" using command down'
}

This answer still works great in Big Sur! It clears the output of the current terminal tab (other windows/tabs are not cleared)
P
Peter Mortensen

On Mac OS X Terminal, this functionality is already built in to the Terminal Application as menu View → Clear Scrollback (the default is CMD + K).

So you can re-assign this as you like with Apple's Keyboard shortcuts. Just add a new shortcut for Terminal with the command "Clear Scrollback". (I use CMD + L, because it's similar to Ctrl + L to clear the current screen contents, without clearing the buffer.)

I am not sure how you would use this in a script (maybe AppleScript as others have pointed out).


As of Yosemite (10.10), View->Clear Scrollback is no longer present in Terminal's menu. The keyboard shortcut CMD + K still works, though.
@NicolasMiari Looks like Clear Scrollback has just moved from View to Edit in Yosemite.
P
Peter Mortensen

With Mac OS X v10.10 (Yosemite), use Option + Command + K to clear the scrollback in Terminal.app.


P
Peter Mortensen

Or you can send a page break (ASCII form feed) by pressing Ctrl + L.

While this technically just starts a new page, this has the same net effect as all the other methods, while being a lot faster (except for the Apple + K solution, of course).

And because this is an ASCII control command, and it works in all shells.


That clears the screen but leaves the scrollback buffer intact.
it is not the same if you want to use cmd + f for exemple
P
Peter Mortensen

Command + K will clear previous output.

To clear entered text, first jump left with Command + A and then clear the text to the right of the pointer with Control + K.

Visual examples:

https://i.stack.imgur.com/ON6Vx.png


P
Peter Mortensen

Do the right thing; do the thing right!

Clear to previous mark: Command + L

Clear to previous bookmark: Option + Command + L

Clear to start: Command + K


P
Peter Mortensen
clear && printf '\e[3J'

clears out everything, and it works well on OS X as well. Very neat.


beautiful, I was just using clear which leaves some stuff when you scroll back up. no more!
P
Peter Mortensen

I couldn't get any of the previous answers to work (on macOS).

A combination worked for me -

IO.write "\e[H\e[2J\e[3J"

This clears the buffer and the screen.


What is IO.write? I had to replace it with printf to get it working. Thanks anyway. This one works best for me
I'm not sure why I chose IO.write. It should work the same however you decide to print those characters to the terminal.
P
Peter Mortensen

Typing the following in the terminal will erase your history (meaning using up arrow will get you nothing), but it will not clear the screen:

history -c

It does. @phil does it deletes them permanently from the disk, or are they still retrievable some way?
Basically it deletes the file ~/.bash_history, so if you can recover that, you can recover the commands that have been cleared
No it doesn't work. Scrolled up history still exist, and I can scroll up to see them again.
Not what was asked. This clears the history, not the current buffer, which are two very different things.
Not what was asked, and harmful; I was just bitten by this, and my history contained important stuff.
P
Peter Mortensen

CMD + K works for macOS. It clears the entire terminal output, but the environment remains.


This is the same answer as the accepted one written 8 years ago.