Limpe a tela de um terminal de verdade

382

O uso do clearcomando no terminal engana o usuário a pensar que a tela foi limpa ... você ainda pode ver a saída dos comandos anteriores ao rolar com o mouse. Isso dificulta a vida quando você está se afogando em um tsunami de texto.

Várias soluções (código de escape, etc.) que podem ser encontradas na Internet são apenas variações do que o comando clear já faz.

Então, como você limpa o conteúdo de um terminal no Linux de verdade?

Autodidata
fonte
44
Eu classificaria isso como "ferramentas de software comumente usadas por programadores" (mencionadas na FAQ como válidas).
Autodidata 20/03
5
O que você realmente está perguntando é "Como posso limpar o buffer de rolagem do terminal?" que é independente do shell (Bash) ou Ubuntu.
Pausado até novo aviso.
@ spiderplant0 provavelmente porque o AskUbuntu é o lugar certo para isso - neste momento. Não existia quando isso foi solicitado, por isso foi fechado como fora de tópico, mesmo que esse não seja o caso.
Jcollum # 14/13
11
Essa é uma pergunta mais geral, afetando não apenas o Ubuntu ou o bash, como observou @Dennis. Eu mudaria o tópico "Limpar a tela do bash Ubuntu para real" -> "Limpar a tela do terminal para real"
Ra_
Existem muitos tipos diferentes de terminais com os quais você pode executar o Bash (o termo " terminal bash " não faz sentido). "Limpar" não é aplicável a todos eles - às vezes, a aproximação mais próxima é rasgar o papel e escanear / desfiar / queimar / destruir a parte que você não deseja.
precisa

Respostas:

500

Use o comando a seguir para fazer uma tela limpa em vez de simplesmente adicionar novas linhas ...

printf "\033c"

sim, isso é um 'printf' no prompt do bash.

Você provavelmente desejará definir um alias embora ...

alias cls='printf "\033c"'

Explicação

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

Portanto, esse <ESC>cé o código de escape do VT100 para redefinir o terminal. Aqui estão mais algumas informações sobre códigos de escape do terminal.

Editar

Aqui estão algumas outras maneiras de fazer isso ...

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

O exemplo acima não funciona no console do KDE (chamado Konsole), mas há esperança! Use a seguinte sequência de comandos para limpar a tela e o buffer de rolagem para trás ...

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

Ou talvez use o seguinte alias no KDE ...

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

Eu recebi o comando de retroceder daqui .

Autodidata
fonte
4
Isso é realmente específico do terminal. "\033c"é ESC ca sequência de escape do VT-XXX para "Redefinição total (RIS)". Quase todos os terminais que as pessoas usam atualmente são compatíveis com VT, mas se você se encontrar usando um terminal estranho, isso pode não funcionar. A resposta de @ vpit3833 tem mais probabilidade de funcionar, desde que TERM esteja definido corretamente.
Laurence Gonsalves
2
printfé um builtin do Bash (é verdade que também é um binário separado, mas os builtins têm precedência e a maioria dos shells modernos printf).
Pausado até novo aviso.
2
@ SDX2000 OK ... Eu sei que você especificou o Ubuntu e presumi que eles se comportariam de maneira semelhante em todos os emuladores de terminal "modernos". Inicialmente, testei no terminal do meu MAC e ele não foi redefinido lá, mas foi redefinido no meu Centos Linux.
nhed
12
echo -en "\ 033c"
Jonathon Reinhart
2
$ 0,02 alguns anos depois, mas eu sou um aluno da CU. Perguntou ao meu professor de sistemas operacionais e ele disse que este era um exemplo de sequência de escape ANSI: en.wikipedia.org/wiki/ANSI_escape_code Este é um exemplo de sinalização em banda.
abgordon
216

Tente reset. Ele limpa a tela do terminal, mas os comandos anteriores podem ser acessados ​​através da seta ou de qualquer tecla pressionada.

vpit3833
fonte
3
Obrigado! Mas limpa tudo, incluindo o prompt. Veja minha resposta para uma solução que não faz isso.
Autodidata 20/03
5
@ SDX2000 Ambos limpam o prompt e, em seguida, o shell gera um novo. A única desvantagem a ser redefinida é que ela parece um pouco mais lenta (provavelmente porque faz mais do que apenas emitir ESC c), mas é mais portátil.
Laurence Gonsalves
@ Laurence obrigado pelo esclarecimento ... Tentei redefinir, mas era tão lento que presumi que o prompt fosse limpo junto com todo o resto. Ainda vou preferir usar, ESC cpois provavelmente nunca usarei outro terminal que não o Ubuntu. Embora resetpossa vir a calhar um dia quando eu estiver depurando uma máquina remota através da porta serial etc.
Autodidact
11
A redefinição do @ SDX2000 também é útil para os casos em que o terminal fica mal danificado porque você matou alguma coisa (ou capturou um arquivo binário) e deixou o seu termo em um estado danificado. Você já entrou em um estado em que seu prompt é exibido, mas não digitado, e quando você pressiona a tecla Enter, o novo prompt é exibido ao lado do prompt anterior e não abaixo dele? redefinir corrige isso. Na verdade, é só isso que eu sempre uso ... Nunca tive a necessidade / desejo de limpar meu buffer de retorno.
Laurence Gonsalves
4
O atraso de um segundo associado reseté insuportável para mim.
Jonathon Reinhart
62
tput reset

Isso será o suficiente!

Comunidade
fonte
2
Executa muito mais rápido que o normal reset, mas ainda faz o trabalho!
Ponkadoodle
11
Mais rápido do que apenas # reset
l2aelba 4/16
Isso nem sempre funcionava, mas o tput clear funcionava
InterLinked
7

Nenhuma das respostas que li funcionou no PuTTY; por isso, encontrei um comentário neste artigo :

Nas configurações da sua conexão, em "Janela-> Comportamento", você encontrará a configuração "Menu Sistema Aparece Somente no ALT". Em seguida, CTRL + L, ALT, l (que é L minúsculo) rolará a tela e limpará o buffer de rolagem.

(relevante para o OP porque estou conectando a um servidor Ubuntu, mas também aparentemente relevante, independentemente do servidor em execução.)

TecBrat
fonte
Um comentário de 3 anos de @Dennis Williamson me levou a esta resposta.
TecBrat
Além disso, como nas configurações de "Janela" do PuTTY você ativou o "Menu do sistema aparece no ALT-Space", você pode fazer CTRL+Lisso rapidamente ALT+Space, o Uque primeiro limpa a janela do terminal e redefine a rolagem para real.
Pierre Voisin
6

O link a seguir explica como tornar esse alias permanente, para que você não precise digitá-lo.

/ubuntu/17536/how-do-i-create-a-permanent-bash-alias

Estas são as etapas detalhadas nesse link.

  1. vim ~ / .bashrc ou gedit ~ / .bashrc ou qualquer editor de texto que você quiser
  2. coloque o apelido cls = 'printf "\ 033c"' na parte inferior do arquivo
  3. salvar e sair
  4. . ~ / .bashrc (e sim, deve haver um espaço entre. e ~)
  5. Agora verifique se tudo funcionou!

Não aceito crédito por essas informações, apenas repassando-as.

N1mr0d
fonte
4

Com o KDE e o Ubuntu 12.04 LTS e o terminal "Konsole", nenhuma das respostas postadas funciona. No entanto, pressionar o atalho de teclado padrão CTRL + Shift + X funciona! Fonte:

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

The111
fonte
3
Isso foi alterado para CTRL + Shift + K nas versões posteriores do KDE: bugs.kde.org/show_bug.cgi?id=282593
Codificador otimizado
4

Meu comando amigável humano favorito para isso é:

reset

Testado em xterm e VT100. Também ajuda após o término anormal do programa. Mantém o buffer de comando, para que a seta para cima percorra os comandos anteriores.

Saúde: D

elbedoit
fonte
3

Sei que a solução que emprega a impressão de novas linhas não é muito suportada, mas se tudo mais falhar, por que não? Especialmente quando alguém está operando em um ambiente em que outra pessoa provavelmente poderá ver a tela, mas não conseguirá fazer o keylogger. Uma solução potencial, então, é o seguinte alias:

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

Em seguida, para "limpar" o conteúdo atual da tela (ou melhor, ocultá-lo), basta digitar c+Enterno terminal.

nemesisfixx
fonte
2

Só para adicionar esse tmuxbuffer de rolagem não limpa com clear, resetou printf. Você precisa :clear-history. Veja o link .

theaws.blog
fonte
-2
echo -e "\e[3J"

Isso funciona em máquinas Linux

Nithin
fonte
5
Apesar de agradecermos sua resposta, seria melhor se ela fornecesse valor adicional além das outras respostas. Nesse caso, sua resposta não fornece valor adicional, pois outro usuário já postou essa solução. Se uma resposta anterior foi útil para você, vote em vez de repetir a mesma informação.
precisa
-53

Compile este aplicativo.

#include <iostream>
#include <cstring>

int main()
{
  char str[1000];
  memset(str, '\n', 999);
  str[999] = 0;
  std::cout << str << std::endl;
  return 0;
}
Máx.
fonte
33
Desculpe, mas esta não é a melhor solução. Existem métodos melhores do que vomitando 999 novas linhas
pbfy0
2
Na verdade, há algum valor nisso. Em alguns terminais, limpar a tela com os outros métodos matará a história e não permitirá que você role para trás ... embora com 999 linhas meu dedo fique cansado. Pobre rapaz.
precisa saber é o seguinte
@ JoshuaDavid O ponto principal da questão era que o OP não queria voltar atrás após a limpeza.
Socowi 16/10
@Socowi Meu comentário foi abordar esta resposta -50 com uma classificação ruim, não o OP. Mas você está certo!
JoshuaDavid