Leitura adicional

Leitura adicional

Quando uso clearo 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)

insira a descrição da imagem aqui

Então eu dobro o comando para obter o comportamento correto:

$ clear && clear && DD=0 ...

insira a descrição da imagem aqui

Por que preciso dobrar o comando para limpar a tela?

Atualização

Na verdade, se eu cleartivesse limpado a tela. Mas posso rolar para cima e ver as últimas 25 linhas (se a tela for 80x25). Quando corro, clear;clearlimpei 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.

  1. O clearcomando analisa terminfo/termcap e emite sequências de controle apropriadas.
    1. Se a entrada terminfo/termcap tiver E3capacidade, 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 o clearcomando.
    2. Em seguida, ele usa a clearcapacidade de limpar a tela visível.
  2. 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 puttyentradadefine E3=\E[3Jqual é a sequência de controle de extensão Xterm.
    • pcvtxxA entrada do console NetBSDé um dos muitos que definem clear=\E[H\E[Jou algo semelhante. Estas são duas sequências de controle ECMA-48 comuns.
  3. 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 CSI Japaga 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.

Quando se trata do Terminal GNOME em particular:

  1. O tipo de terminal está correto gnome, mas algumas pessoas o deixam configurado erroneamente como xterm.
  2. A gnomeentrada terminfonão define uma E3capacidade e em muitos sistemas — ainda assim! - nem a xtermentrada, pois esta não foi infiltradaInformações sobre o termo Dickey. Então, clearapenas escreve o conteúdo do clearrecurso.
  3. O conteúdo da clearcapacidade dessas entradas terminfo são as sequências de controle para colocar o cursor na posição inicial e depois apagar a tela inteira.
  4. 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 clearcomando 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

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 tputdeve 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 resetdefinido pelo POSIX, ele também deve funcionar em qualquer sistema compatível com POSIX:https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html

informação relacionada