Portanto, quando wget
obtém uma página da Web, ela mostra uma barra de status que indica quanto os arquivos são baixados. Se parece com isso:
25%[=============>______________________________________] 25,000 100.0K/s
(sublinhados são espaços; eu simplesmente não conseguia descobrir como obter mais de um espaço consecutivo)
No entanto, em vez de escrever outra linha no stdout e adicionar outra barra de progresso, ele é atualizado da seguinte maneira:
50%[===========================>________________________] 50,000 100.0K/s
E wget
também não é o único exemplo disso. Por exemplo, quando você canaliza algo para dentro less
e depois sai, o prompt original ainda está lá, junto com o resultado de qualquer comando executado anteriormente. É como se você nunca fosse embora.
Portanto, minhas perguntas são: como é chamado, como implementá-lo, ele funciona apenas para uma única linha de cada vez e posso usá-lo em C?
Respostas:
Antes de tudo, sua pergunta não tem nada a ver com o bash, mas com o terminal. O terminal está respondendo pela exibição do texto dos programas e o bash em si não tem controle sobre os programas após o lançamento.
Os terminais oferecem seqüências de controle para controlar cor, fonte, posição do cursor e muito mais. Para obter uma lista de seqüências de terminais padronizadas, consulte http://www.termsys.demon.co.uk/vtansi.htm Você pode, por exemplo,
para criar uma barra de progresso.
Sequências de escape de terminal mais avançadas geralmente dependem do terminal, por exemplo, funcionam apenas com Eterm ou xterm. ncurses - é uma biblioteca de programação que cria programas interativos com o terminal para que você não precise usar seqüências de escape.
Como sobrescrever uma linha existente com seqüências de terminais
Como sobrescrever uma linha existente sem sequência de terminais
Uma solução simples é não escrever uma nova linha no final, mas escrever retorno de carro, que basicamente redefine o cursor para o início da linha, por exemplo:
O
\r
retorno de carro ou colocará o cursor no início da linha e permitirá substituir o conteúdo da linha.Alterne entre buffers como
less
ouvi
O comportamento de
less
também é devido a um recurso de terminal mais avançado, a tela alternativa:http://rosettacode.org/wiki/Terminal_control/Preserve_screen lista alguns exemplos de como fazer você mesmo, seja por tput ou por algumas seqüências de escape.
fonte
Em vez de usar o
echo
que anexa automaticamente uma nova linha à string, useprintf "%s\r" whatever
- o retorno de carro envia o cursor para o início da linha atual. exemplo:fonte
printf "\r%2d " $num