Linux + como criar barra de progresso simples no bash [duplicado]

1

Eu quero adicionar uma barra de progresso no meu script bash que mostre o "." caractere como progresso e processo finalizado após MAX 180 segundos

no script bash eu uso o comando curl, então enrole os resultados depois de algum tempo, mas não maior que 180 segundos

algo assim

|.                                           after 2 sec
|...........                                 after 60 sec
|...................                         after 100 sec
|..........................                  after 150 sec
|................................|           after 180 sec 

exemplo final

|................................|       after 180 sec 

ou

|....|                                   after 30 sec 
    
por yael 07.01.2018 / 18:30

2 respostas

3

Isso é bastante simples de se fazer em Bash simples:

#!/bin/bash
# progress bar function
prog() {
    local w=80 p=$1;  shift
    # create a string of spaces, then change them to dots
    printf -v dots "%*s" "$(( $p*$w/100 ))" ""; dots=${dots// /.};
    # print those dots on a fixed-width space plus the percentage etc. 
    printf "\r\e[K|%-*s| %3d %% %s" "$w" "$dots" "$p" "$*"; 
}
# test loop
for x in {1..100} ; do
    prog "$x" still working...
    sleep .1   # do some work here
done ; echo

O primeiro argumento para prog é a porcentagem, quaisquer outros são impressos após a barra de progresso. A variável w na função controla a largura da barra. Imprima uma nova linha depois de terminar, a função não imprime uma.

Outra possibilidade seria usar a ferramenta pv . Ele serve para medir o throughput de um pipeline, mas podemos criar um para ele:

for x in {1..100} ; do
    sleep .1    # do some work here
    printf .
done | pv -pt -i0.2 -s100 -w 80 > /dev/null

Aqui, -pt ativa a barra de progresso e o temporizador, -s 100 define o tamanho total da saída e o que imprimirmos dentro da função conta com esse tamanho.

    
por 07.01.2018 / 21:16
1

Em geral, você pode implementar isso sobrescrevendo uma linha. Use \r para voltar ao início da linha sem escrever \n no terminal.

Escreva \n quando terminar para avançar a linha.

Use echo -ne para:

  • não imprime \n e
  • para reconhecer seqüências de escape como \r.

Aqui está uma demonstração:

echo -ne '...                     (33%)\r'
sleep 1
echo -ne '......                  (66%)\r'
sleep 1
echo -ne '..........              (100%)\r'
echo -ne '\n'

EDIT: Agora, o cURL vem com uma barra de progresso: --progress-bar , não é isso que você quer?

da resposta para link

Encontrei isso com o Google, primeira resposta, com os seguintes termos de pesquisa: "bash progress bar"

    
por 07.01.2018 / 18:33