Como limpar a saída anterior no Terminal no Mac OS X?

523

Conheço o clearcomando que 'limpa' a tela atual, mas faz isso apenas imprimindo muitas linhas novas - o conteúdo limpo apenas é rolado para cima.

Existe uma maneira de limpar completamente toda a saída anterior do terminal para que eu não possa alcançá-la, mesmo rolando para cima?

Eonil
fonte
1
Você já encontrou uma maneira de fazer isso que funcione em um shell script?
Zev Eisenberg 8/14
7
@ZevEisenberg Acho que não. Enfim, agora acho que não preciso disso. Estou satisfeito com Command+K.
Eonil
@ZevEisenberg minha resposta atualizada (e outra resposta) mostra como fazer isso a partir de um script.
Alok Singhal

Respostas:

1100

Para limpar o terminal manualmente:

+K

Command+ Kpara teclados mais recentes

Para limpar o terminal de dentro de um script de shell;

/usr/bin/osascript -e 'tell application "System Events" to tell process "Terminal" to keystroke "k" using command down'
Alok Singhal
fonte
@fearless_fool apple.stackexchange.com/a/31887 pode fazê-lo? Se isso acontecer, por favor me avise!
Alok Singhal
Bem, sim, mas veja abaixo ( stackoverflow.com/a/26615036/558639 ) para uma maneira melhor.
Fearless_fool
9
Se você acidentalmente pressionasse isso, como seria a visualização do buffer limpo?
Joshua Pinter
4
@ Joshinter, apenas não pressione por acidente. :) (Considere o uso clearpara todos os casos , exceto onde você precisa a história scrollback para realmente desaparecer, por exemplo, quando você está indo para imprimir.)
Wildcard
2
@ Faircard Fair o suficiente. :) Bons conselhos sobre o uso clear. Eu sinto que eles deveriam ser revertidos, no entanto. Digitar clearparece mais intencional do que bater Command + K.
Joshua Pinter
85

Uma maneira melhor de limpar a tela de dentro de um script ...

Se você estiver usando o aplicativo OSX Terminal (conforme declarado pelo OP), uma abordagem melhor (graças a https://apple.stackexchange.com/a/113168 ) é exatamente isso:

clear && printf '\e[3J'

ou mais concisamente (dica para https://stackoverflow.com/users/4834046/qiuyi ):

printf '\33c\e[3J'

que limpa o buffer de rolagem e a tela. Também existem outras opções, consulte https://apple.stackexchange.com/a/113168 para obter mais informações.

resposta original

A resposta AppleScript dada neste segmento funciona, mas tem o efeito colateral desagradável de limpar QUALQUER janela do terminal que esteja ativa. Isso é surpreendente se você estiver executando o script em uma janela e tentando concluir o trabalho em outra!

Você evita isso refinando o AppleScript para limpar a tela apenas se estiver na frente, fazendo isso (obtido em https://apple.stackexchange.com/a/31887 ):

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

... mas como quando não é a janela atual, a saída se empilha até que se torne atual novamente, o que provavelmente não é o que você deseja.

fearless_fool
fonte
1
Eu usei o "caminho melhor" .bash_profilee é incrível, porque às vezes não recebo o buffer com falha ao abrir uma nova janela do terminal.
Patrick Roberts
1
Esta é a resposta mais conceitualmente correta. A resposta de qiuyi evita o && no sacrifício de um pouco de legibilidade. Se a resposta de Alok pudesse ser estendida para limpar o terminal que está executando o script atual, seria uma melhoria, mas isso é mais simples.
Zack Morris
1
Isso é waaaaaaaaaaay melhor para scripts. Muito obrigado!
21316 Andy
Isso é perfeito para quando você é transferido para outro sistema, obrigado!
JBWilkinson
48

O jeito bonito é printf '\33c\e[3J'

qiuyi
fonte
3
Esta é a melhor maneira. Devemos definir alias comoalias cls='printf "\33c\e[3J"'
mpyw 27/04/2015
Obrigado, é exatamente isso que eu precisava.
precisa saber é o seguinte
Trabalha em iTerm2 bem
Anders Zommarin
1
@ LoïcFaure-Lacroix, \33cexecuta o equivalente ao clearcomando, que basicamente apenas rola a tela até que você não consiga ver o conteúdo anterior. Ele limpa a tela, mas não o buffer de rolagem para trás (ou seja, você ainda pode usar as barras de rolagem para ver a saída antiga). Adicione o \e[3Jpara realmente limpar o buffer de rolagem para trás.
luiss 19/09/17
@EirNym, adicione function cls { printf '\33c\e[3J\33c' }linha ~/.profile(ou em todo o sistema /etc/profile). Isso deve funcionar em ambientes de desktop no macOS, FreeBSD, Linux etc. Observe que o extra \33cé para limpar o \e[3Jliteral extra no não-macOS (basicamente para Linux / FreeBSD, precisamos apenas printf '\33c').
corvo vulcan
33

Coloque isso no seu .bash_profile ou .bashrc

function cls { 
osascript -e 'tell application "System Events" to keystroke "k" using command down' 
}
Robert Simmons Jr.
fonte
Essa deve ser a resposta correta. AppleScript pode ser confuso, mas, ei, faz o trabalho. Obrigado.
allanberry
Tinha votado, mas outra resposta observa que isso limpa todas as janelas!
Michael Bushe
20

No Mac OS X Terminal, essa funcionalidade já está incorporada ao Aplicativo de Terminal como View->Clear Scrollback(o padrão é CMD+ K).

Assim, você pode redesigná-lo como quiser com os atalhos de teclado da Apple. Basta adicionar um novo atalho para o Terminal com o comando "Clear Scrollback". (Uso CMD+ L, porque é semelhante a CTRL+ Lpara limpar o conteúdo da tela atual, sem limpar o buffer.)

Não tenho certeza de como você usaria isso em um script (talvez AppleScript, como outros já apontaram).

SeaSide
fonte
1
A partir de Yosemite (10.10), View->Clear Scrollbacknão está mais presente no menu do Terminal. O atalho de teclado CMD+ Kainda funciona, no entanto.
Nicolas Miari 28/09/2015
1
@NicolasMiari Parece que Clear Scrollbackacabou de passar de Viewpara EditYosemite.
BrainSteel
10

Com o Mac OS X Yosemite (10.10), use Option + Command + Kpara limpar a rolagem no Terminal.app.

David J.
fonte
9

Ou você pode enviar uma quebra de página (feed de formulário ASCII) pressionando:

CTRL+L

Enquanto isso tecnicamente apenas inicia uma nova página, isso tem o mesmo efeito líquido que todos os outros métodos, embora seja muito mais rápido (exceto para a solução Apple + K, é claro).

E porque este é um comando de controle ASCII, ele funciona em todos os shells.

user2897962
fonte
1
Isso limpa a tela, mas deixa o buffer de rolagem intacto.
George George
não é o mesmo, se você quiser usar cmd + f para exemple
bormat
7

Para excluir apenas a última saída:

+L

Para limpar o terminal completamente:

+K

Aman Jain
fonte
6

Command + K limpa a saída anterior

Para limpar o texto digitado, primeiro pule para a esquerda com " Command + A " e depois apague o texto à direita do ponteiro com " Control + K ".

Exemplos visuais: insira a descrição da imagem aqui

Punnerud
fonte
5
clear && printf '\e[3J'

limpa tudo, funciona bem no osX também. muito arrumado

jeevjyot singh chhabda
fonte
5

Faça a coisa certa, faça a coisa certa!

Limpar para a marca anterior:Command-L

Limpar para o marcador anterior:Option-Command-L

Limpar para começar: Command-K

Ajude seus rapazes!

McAllister Bowman
fonte
1

Não consegui fazer com que nenhum dos itens acima funcione (no macOS).

Uma combinação funcionou para mim -

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

Isso limpa o buffer e a tela

Michael Baldry
fonte
O que é o IO.write? Eu tive que substituí-lo por printf para fazê-lo funcionar. Obrigado mesmo assim. Este funciona melhor para mim
Fitsyu
1
Não sei por que escolhi IO.write. Deve funcionar da mesma maneira, mas você decide imprimir esses caracteres no terminal.
Michael Baldry
1

Digitando o seguinte no terminal irá apagar seu histórico (ou seja, usando a seta para cima vai te dar nada) - mas não vai limpar a tela:

history -c
phil
fonte
Faz. @phil os exclui permanentemente do disco ou eles ainda podem ser recuperados de alguma forma?
Steven Roose
Basicamente, ele exclui o arquivo ~ / .bash_history, por isso, se você pode recuperar isso, você pode recuperar os comandos que foram desmatadas
Ryan Pendleton
Não, não funciona. O histórico rolado para cima ainda existe, e eu posso rolar para cima para vê-los novamente.
Eonil
26
Não foi o que foi perguntado. Isso limpa o histórico, não o buffer atual, que são duas coisas muito diferentes.
Sean Cameron
1
Não é o que foi pedido e prejudicial ; Fui mordido por isso e minha história continha coisas importantes.
Elazar
0

Tente isso, se você estiver sobrecarregado com a saída, se quiser um filtro

atividade de db do shell adb -d | grep ActivityRecord

sreekumar
fonte
-4

CMD + K parece funcionar o tempo todo para mim.

CoeB
fonte
2
Esta é a mesma resposta que a aceita, escrita há 8 anos.
piksel bitworks