Quero implementar uma barra de progresso mostrando os segundos decorridos no bash. Para isso, preciso apagar a última linha mostrada na tela (o comando "limpar" apaga toda a tela, mas preciso apagar apenas a linha da barra de progresso e substituí-la pelas novas informações).
O resultado final deve ser semelhante a:
$ Elapsed time 5 seconds
Depois de 10 segundos, quero substituir essa frase (na mesma posição na tela) por:
$ Elapsed time 15 seconds
for i in {1..100000}; do echo -en "\r$i"; done
para evitar a chamada deO retorno de carro por si só move o cursor para o início da linha. Tudo bem se cada nova linha de saída for pelo menos tão longa quanto a anterior, mas se a nova linha for mais curta, a linha anterior não será completamente substituída, por exemplo:
Para realmente limpar a linha do novo texto, você pode adicionar
\033[K
depois de\r
:http://en.wikipedia.org/wiki/ANSI_escape_code
fonte
\e[K
vez de\033[K
.\033[G
io\r
antes,\033[K
embora obviamente\r
seja muito mais simples. Também invisible-island.net/xterm/ctlseqs/ctlseqs.html fornece mais detalhes do que a Wikipedia e é do desenvolvedor xterm.A resposta de Derek Veit funciona bem, desde que o comprimento da linha nunca exceda a largura do terminal. Se este não for o caso, o código a seguir evitará a saída de lixo:
antes que a linha seja escrita pela primeira vez, faça
que salva a posição atual do cursor. Agora, sempre que quiser imprimir sua linha, use
para primeiro retornar à posição salva do cursor, limpar a tela do cursor para baixo e, finalmente, escrever a saída.
fonte
tput sc # save cursor echo '' > sessions.log.json while [ 1 ]; do curl 'http://localhost/jolokia/read/*:type=Manager,*/activeSessions,maxActiveSessions' >> sessions.log.json echo '' >> sessions.log.json cat sessions.log.json | jq '.' tput rc;tput el # rc = restore cursor, el = erase to end of line sleep 1 done
tput ed
vez detput el
. O exemplo de @ Um usadoed
(talvez ele consertou depois que você comentou).O método \ 033 não funcionou para mim. O método \ r funciona, mas na verdade não apaga nada, apenas coloca o cursor no início da linha. Portanto, se a nova string for mais curta do que a antiga, você poderá ver o texto restante no final da linha. No final das contas, tput foi o melhor caminho a seguir. Ele tem outros usos além do cursor e vem pré-instalado em muitas distros Linux e BSD, então deve estar disponível para a maioria dos usuários do bash.
Aqui está um pequeno script de contagem regressiva para brincar:
fonte
Caso a saída de progresso seja de várias linhas ou o script já tenha impresso o caractere de nova linha, você pode pular as linhas com algo como:
printf "\033[5A"
o que fará com que o cursor salte 5 linhas para cima. Em seguida, você pode sobrescrever o que for necessário.
Se isso não funcionar, você pode tentar
printf "\e[5A"
ouecho -e "\033[5A"
, que deve ter o mesmo efeito.Basicamente, com as sequências de escape, você pode controlar quase tudo na tela.
fonte
tput cuu 5
, onde 5 é o número de linhas (cuu
para mover para cima,cud
para mover para baixo).Use o caractere de retorno de carro:
fonte
Pode alcançá-lo colocando o retorno do carro
\r
.Em uma única linha de código com
printf
ou com
echo -ne
fonte