Quais comandos posso usar para redefinir e limpar meu terminal?

64

Eu tenho usado o comando:

reset

para limpar meu terminal. Embora eu tenha certeza de que não é isso que eu deveria estar fazendo. Redefinir, como o nome sugere, redefine todo o terminal (altera muitas coisas). Aqui está o que eu quero:

Basicamente, eu quero usar o comando clear. No entanto, se você limpar e depois rolar para cima, ainda receberá toneladas de material de antes. Em geral, isso não é um problema, mas estou vendo logs brutos longos e quero ter certeza de que estou apenas visualizando o mais recente. Eu sei que eu poderia usar moreou algo parecido, mas eu prefiro essa abordagem.

sixtyfootersdude
fonte
parece haver muita confusão sobre o que exatamente está sendo perguntado aqui. você pode esclarecer a pergunta? o que exatamente você está tentando realizar, limpando o buffer de rolagem do terminal? (em caso afirmativo, qual aplicativo de terminal você está usando?)
quack quixote
1
Ctrl-L limpará a tela no bash (no modo emacs, que é o padrão), semelhante à execução do programa de limpeza.
Acabei de testar isso no terminal bash no IntelliJ IDE. Funciona bem e limpa a rolagem, que é exatamente o que eu queria. Obrigado.
Ian Lewis
Eu sei que isso foi respondido até a morte, mas acho que o que você quer é clear && printf '\033[3J'. Sem redefinição de terminal, apenas limpando o texto na tela. Veja esta postagem: superuser.com/questions/555554/…
jwd 10/10

Respostas:

57

O buffer de rolagem não é um recurso do bash, mas do programa do terminal. Você não disse qual terminal está usando.

Se você estiver usando o xterm, poderá limpar as linhas salvas ecoando ESC-c no terminal.

Isso pode ou não funcionar em qualquer programa de terminal que você esteja usando.

No Linux, isso provavelmente funcionará:

echo -e '\0033\0143'

no FreeBSD echo não aceita -e para que você possa tentar:

printf '\033\143'
Craig
fonte
Estou usando o xterm. No entanto, eu não entendo o que você quer dizer. Devo digitar literariamente echo ESC-c?
sixtyfootersdude
2
@sixtyfootersdude: Não, não é literal ESC. Leia os artigos "Caractere de escape" e "Caractere de controle" na Wikipedia - ESCgeralmente é usado para indicar o caractere ASCII 0x1B, que você pode inserir pressionando ^Vseguido de Esc.
grawity
1
Você não deveria. Se sua solução envolve a gravação de seqüências brutas de escape de terminal, você deve repensar a solução. Eu usaria "menos" em vez de gato. Se você realmente deseja aprender sobre "seqüências de escape terminais", o Google pode ajudá-lo.
26710 Craig
2
@HaraldNordgren é melhor usar o printf mais padrão do que echo -e.
Boa Pessoa
3
Por que ao \0143invés de c?
Ruakh
51

Use a ferramenta certa para cada trabalho:

  • Use clearpara limpar a janela do terminal.

  • Use resetpara redefinir seu terminal quando ele estiver bagunçado pelas seqüências de controle.

  • Use catsomente quando desejar transmitir muitos dados de um lugar para outro sem interrupção .

  • Use um programa de pager como lessou mostpara visualizar as páginas de saída.

  • Use tail -f /var/log/foo.log /var/log/bar.logpara assistir a vários arquivos de log diferentes.

    • Com o GNU tail, a -Fopção é melhor porque pode continuar acompanhando o arquivo mesmo quando um novo arquivo aparecer em seu lugar, como é comum nos arquivos de log.
nariz grande
fonte
14
Isso realmente não responde à minha pergunta.
sixtyfootersdude
7
Sim ele faz. Não crie arquivos de gato para lê-los, arquivos de gato para concatená-los. Use menos ou mais para ler arquivos - então você não tem o mesmo problema.
Rich Bradshaw
Pesquise "uso inútil de gato"
galois 10/0418
Muitas pessoas se opõem ao uso de catler qualquer coisa, mas para arquivos pequenos, na verdade, faz muito sentido para catelas, em vez de usar less. Depois que o arquivo for despejado no terminal, você poderá olhar / rolar de volta para o arquivo quantas vezes quiser, em vez de precisar descartar lessantes de fazer qualquer outra coisa.
GKFX 14/03
22

Apenas para fornecer a resposta técnica: resetreinicialize o terminal, como se tivesse sido reaberto do zero. stty sanefará a mesma funcionalidade (sem a redefinição). É o mesmo que ^L(Ctrl + L) (irrc) e tput clear. Apesar do que o pôster anterior (@grawity) disse, clearnão gera muitas novas linhas. Ele envia a TERMredefinição como definida em terminfoou termcap, para mim, usando gnome-terminal(xterm) é igual ao comando perl -e'print "\33[H\33[2J"'.

Se você quiser apenas limpar o buffer - em comparação com a reposição de todo o terminal, tente isso tput reset. Ele deve ser muito rápido, e fazer o que quiser. (Embora você realmente deva ler arquivos com less)

tput reset, envia o valor terminfo para redefinir - no meu terminal (xterm) é o mesmo que perl -e'print "\33c"'

Evan Carroll
fonte
1
Eu não disse que clearproduz um monte de novas linhas. Eu apenas forneci um comando como uma alternativa a ele, porque clearapenas limpa a tela, mas não o buffer de rolagem. (Não em PuTTY ou Konsole, pelo menos.)
grawity
1
Por esse motivo, imprimir várias novas linhas não é realmente uma alternativa para limpar - você não tem idéia do que o terminal fará com o sinal de limpeza. É melhor apenas dizer às novas pessoas que você tem um banco de dados que sabe como lidar com o seu terminal, ele tem dois valores-chave: um que mapeia clearcomo nome de sinal para um sinal e outro que mapeia resetpara um sinal - e somente o último resulta em um buffer de rolagem de retorno limpo. resetenvia o último, acima fazendo outras coisas divertidas.
Evan Carroll
1
De acordo com a pergunta original de sixtyfootersdude, clearque não redefinir sua scrollback. ( ESC ctrabalha em xterme baseado em VTE, mas não em PuTTY e Konsole.) Ele também não quer usar reset, pois redefine mais do que deseja. (Eu não sei qual terminal que ele usa - mas comparar sttyantes e após a reposição.)
grawity
2
como eu disse, ele provavelmente quer tput reset, que envia o sinal de redefinição para o terminal - sem realmente reinicializar o termo. "reset - Em vez de colocar as strings de inicialização, as strings de reset do terminal serão emitidas se presentes (rs1, rs2, rs3, rf). Se as strings de reset não estiverem presentes, mas as strings de inicialização estiverem, as strings de inicialização serão exibidas. Caso contrário, redefinir atua de forma idêntica ao init. " Aqui, redefinimos as strings para que as strings init não sejam executadas.
Evan Carroll
+1: para a sugestão, no entanto, tput reseté bastante lento (o mesmo que reset). printf '\033\143'é muito mais rápido. Existe alguma razão para o método printf ser perigoso / ruim?
sixtyfootersdude
9

Outro terminal é o iTerm2, e possui uma sequência de escape um tanto estranha usada para limpar a rolagem. Em um shell Bash, eu uso algo como:

echo -ne '\033]50;ClearScrollback\a'

em um script. Então, basicamente, é um caractere ESC, seguido por " ]50;ClearScrollback" e, em seguida, um caractere BEL.

Sam Mason
fonte
1
O CMD + K funciona no iTerm2. CTRL + K funciona em muitos outros.
blockloop 10/05
Eu gosto dessa solução porque ela permite que eu limpe o buffer de rolagem do iTerm2 a partir de um script de shell, quando coisas gostam cleare resetnão. Esta não é realmente a melhor resposta para a pergunta, no entanto. Acho que a resposta certa para esse caso é o que quer que as ofertas de aplicação de terminais, como o comando-K em iTerm2, controle-K em outros, etc.
LS
8

Provavelmente, a melhor maneira de limpar tudo é usar a função do terminal:

  • Konsole: Ctrl+ Shift+ KVer → Limpar scrollback e redefinir
  • Terminal GNOME: Editar → Redefinir e limpar
  • PuTTY: Ctrl+ right-click→ Limpar rolagem

Dessa forma, os dois buffers são limpos e o estado do terminal é redefinido exatamente para o que estava na inicialização (o que pode ou não ser o mesmo que usar reset).

gravidade
fonte
Hmm, eu não tenho isso no meu gnomo ... #
sixtyfootersdude
@sixtyfootersdude: Tenho certeza de que está lá, simplesmente não sei o menu exato (não posso me usar gnome-terminalno momento) ... Veja "Ferramentas" e outros menus.
grawity
No xterm, seu botão ctrl-middle -> "redefine e limpa as linhas salvas"
Craig
3
menos -W + F foo.log

+Fé para "seguir", semelhante a, tail -fmas permite que você role novamente.

Todos os terminais baseados em vte (GNOME, Xfce, Roxterm) e KDE Konsole permitem que você use a roda de rolagem para rolar para dentro less. Acho isso bastante conveniente.


Alternativa para clear:

perl -e 'imprime "\ n" x512;'

xterm -e 'tail -f foo.log'
gravidade
fonte
3

No Mac OS X Terminal.app:

Ver -> Limpar rolagem (ou command- K)

acajaja
fonte
@Rohit Se a pergunta era especificamente sobre o Mac OS X Terminal.app, sim, esta é uma ótima resposta. No entanto, a pergunta original é ambígua, o melhor que posso dizer, com relação a qual terminal e SO estão em jogo.
David J.
2

Não é um problema "Bash". Depende do terminal que você usa. Por exemplo, eu uso "iterm2" com o macbook para conectar uma máquina Linux remota. Você pode usar "command + K" para limpar o buffer ou, no menu, escolha "Edit" -> "Clear Buffer".

Steven Huang
fonte
1

Para limpar a tela do console e o buffer de rolagem ao executar o PuTTY, isso funciona para mim:

echo -en "\ec\e[3J"

Na verdade, são 2 sequências "Esc" que agem independentemente ... elas podem ser usadas em qualquer ordem:

# clears the console screen, but not the scrollback buffer
# this is actually the escape code to "reset" the terminal
echo -en "\ec"

# clears the scrollback buffer, but not the console screen
# screen content remains, and cursor position remains at its last position
echo -en "\e[3J"

O uso echo -en "\ec"que redefine o terminal pode alterar algumas de suas outras configurações. Em vez de "Redefinir", você pode fazer o seguinte:

# position the cursor to "Home" (Top Row, First Column)
echo -en "\e[H"

# Erase down: clear the screen from the cursor down to the bottom of the screen.
echo -en "\e[J"

# Note: this is supposed to clear the screen and position the cursor to home,
# but it didn't work like that for me. It cleared the entire screen (above and 
# below the cursor), but left the cursor at its last position.
echo -en "\e[2J"

# putting everything together
echo -en "\e[H\e[J\e[3J"

Você pode colocar isso em um script de shell e funciona muito bem.


Caso haja algumas dependências do sistema:

Estou usando o PuTTY Connection Manager (versão 0.7.1 BETA (build 136)), com o PuTTY (versão 0.60).

Digitando:

echo \"$TERM\"; /bin/sh --version

relatórios:

"xterm"
GNU bash, version 4.1.2(1)-release-(x86_64-redhat-linux-gnu) ...
Kevin Fegan
fonte
1

Para limpar o buffer de tela do hardware TTY no FreeBSD, você pode usar "vidcontrol - utilitário de configuração e controle do console do sistema" com o parâmetro -C Limpe o buffer de histórico.

vidcontrol -C

o comando apagará todo o buffer de tela do console atual, acima do que você vê no momento. Você pode querer "limpar" primeiro, ou não - depende de você.

do utilizador
fonte
0

Se você quiser ter certeza de que está vendo as entradas mais recentes em um arquivo de log, provavelmente é melhor usar cauda em vez de clear/ catque eu assumo que você esteja usando.

Josh K
fonte
Na verdade, estou usando tail -f (logs contínuos), no entanto, porque ocasionalmente cospem milhares de linhas, é importante fazer a rolagem para trás. No entanto, seria bom saber que não estou olhando de volta para um log mais antigo.
sixtyfootersdude
0

Hummm. Acho que se você estiver executando o konsole, estará sem sorte. Costumava ser apenas "limpar o scrollback". O Konsole não permitirá mais que você faça isso. Você também deve redefini-lo, para matar qualquer programa em execução. Acho que preciso de um novo programa de terminal ......

Bruce
fonte