
Quando uso clear
o comando para limpar a tela. Não está limpo (veja a captura de tela quando eu rolar um pouco para cima após o comando ser concluído)
Então eu dobro o comando para obter o comportamento correto:
$ clear && clear && DD=0 ...
Por que preciso dobrar o comando para limpar a tela?
Atualização
Na verdade, se eu clear
tivesse limpado a tela. Mas posso rolar para cima e ver as últimas 25 linhas (se a tela for 80x25). Quando corro, clear;clear
limpei essas linhas.
Responder1
O importante a notar aqui é a tag da pergunta. Este comportamento é específico do Terminal GNOME e de quaisquer outros emuladores de terminal criados com base no libvte. Você não verá isso no Xterm, ou no Unicode RXVT, ou no emulador de terminal embutido no kernel do Linux, ou no console do FreeBSD.
O que acontece em geral é isso.
- O
clear
comando analisa terminfo/termcap e emite sequências de controle apropriadas.- Se a entrada terminfo/termcap tiver
E3
capacidade, ela primeiro escreve isso. Isso emite sequências de controle para limpar o buffer de rolagem. Isto e a história por trás disso estão documentados em detalhes ema página de manual do Dickey ncurses para oclear
comando. - Em seguida, ele usa a
clear
capacidade de limpar a tela visível.
- Se a entrada terminfo/termcap tiver
- As sequências de controle na entrada terminfo/termcap são determinadas pelo tipo de terminal; mas, com exceção dos terminais (hoje raros) que usam FormFeed para limpar a tela (o que os VTs DEC e seus imitadores não fazem), eles são simplesmente sequências de controle ECMA-48 antigas ou extensões delas. Por exemplo:
- A
putty
entradadefineE3=\E[3J
qual é a sequência de controle de extensão Xterm. pcvtxx
A entrada do console NetBSDé um dos muitos que definemclear=\E[H\E[J
ou algo semelhante. Estas são duas sequências de controle ECMA-48 comuns.
- A
- O emulador de terminal atua nas sequências de controle. Conforme definido pelo ECMA-48 e pela extensão Xterm:
- CSI
H
(CUP) posiciona o cursor. - CSI
0
J
(ED 0) ou apenas CSIJ
apaga da posição atual do cursor até o final da tela. - CSI
2
J
(ED 2) apaga a tela inteira. - CSI
3
J
(ED 3) apaga o buffer de rolagem.
- CSI
Quando se trata do Terminal GNOME em particular:
- O tipo de terminal está correto
gnome
, mas algumas pessoas o deixam configurado erroneamente comoxterm
. - A
gnome
entrada terminfonão define umaE3
capacidade e em muitos sistemas — ainda assim! - nem axterm
entrada, pois esta não foi infiltradaInformações sobre o termo Dickey. Então,clear
apenas escreve o conteúdo doclear
recurso. - O conteúdo da
clear
capacidade dessas entradas terminfo são as sequências de controle para colocar o cursor na posição inicial e depois apagar a tela inteira. - Mas o Terminal GNOME não implementa o apagamento da tela inteira corretamente. Mais especificamente, a biblioteca em que se baseia, libvte, não faz isso no código desua
VteTerminalPrivate::seq_clear_screen()
função. Em vez disso, libvte rola a tela para baixo em linhas em branco e move a posição do cursor para a primeira dessas linhas em branco.
É por isso que você vê o que vê. libvte não está apagando a tela inteira quando solicitado. Em vez disso, está fazendo algo que tem uma semelhança superficial com isso, até que se faça exatamente o que o questionador fez aqui: role a janela do terminal para trás para ver o buffer de rolagem. Então a diferença é flagrante.
Em outros emuladores de terminal, como Xterm e Unicode RXVT, a sequência de controle ED 2 realmente apaga a tela, apagando todas as posições da tela, de cima para baixo, e não alterando o buffer de rolagem. Mas nos emuladores de terminal libvte, ele apenas empurra a tela atual para o buffer de rolagem e adiciona linhas em branco na tela. O conteúdo da tela anterior não é apagado, mas transferido para o buffer de rolagem.
E se você executar o clear
comando duas vezes, ele adicionadoistela com linhas em branco. Se o seu buffer de rolagem for grande o suficiente, você podeaindaencontre o conteúdo original da tela, simplesmente mais acima no buffer de rolagem.
Leitura adicional
- Funções de controle para conjuntos de caracteres codificados. ECMA-48. 1976.
- Georgi Kirilov (30/12/2007).Ctrl-L adiciona espaço em branco ao buffer de rolagem. Bug do GNOME #506438.
- Até que ponto os emuladores de terminal xterm, xterm-color e linux são baseados no VT100?
- Limpando o buffer de rolagem "antigo"
- O comportamento estranho do comando Bash clear exclui o buffer de rolagem.
- https://superuser.com/questions/1094599/
- Thomas Dickey (2018). "Bugs conhecidos no XTerm e similares: Terminal GNOME". Perguntas frequentes sobre XTerm. ilha-invisível.net.
- Thomas Dickey (2018). "Bugs conhecidos em XTerm e similares: notas sobre VTE". Perguntas frequentes sobre XTerm. ilha-invisível.net.
Responder2
Se você quiser limpar o terminal e destruir todo o buffer de saída, recomendo fazer isso tput reset
. Isso definitivamente limpará o terminal e corrigirá seu estado como um bônus se, por exemplo, algum programa anterior travar e deixar o terminal em estado sujo. Além disso, ele tput
deve ser inteligente o suficiente para descobrir o tipo de terminal correto, para que você não precise saber se o seu terminal usa VT100 ou alguma outra sequência de comandos.
Conforme tput reset
definido pelo POSIX, ele também deve funcionar em qualquer sistema compatível com POSIX:https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html