Progressbar no bash para visualizar o tempo de espera

6

Em um script bash, às vezes, você precisa que o usuário espere alguns segundos para que um processo em segundo plano seja concluído.

Eu costumo usar, por exemplo:

sleep 10

Como posso adicionar um tipo de barra de progresso ao script, para que o usuário saiba quanto tempo esperar?

Eu instalei o comando bar , mas não entendi o manual.

    
por rubo77 30.09.2013 / 06:25

4 respostas

12
while true;do echo -n .;sleep 1;done &
sleep 10 # or do something else here
kill $!; trap 'kill $!' SIGTERM
echo done

isto iniciará um loop while infinito que ecoa spinner a cada segundo, isto é executado em segundo plano.

Execute o comando sleep ou qualquer comando desejado.

Quando esse comando terminar a execução, isso matará o último trabalho em execução em segundo plano (que é o loop while infinito)

fonte: link

Você pode usar vários loops while, por exemplo. um spinner como este:

while :;do for s in / - \ \|; do printf "\r$s";sleep 1;done;done
    
por 30.09.2013 / 07:10
6

Isso deve ser o suficiente para você começar:

#!/bin/bash

for i in {001..100}; do
    sleep 1
    printf "\r $i"

done

O uso da sequência de escape \r retorna a linha ao início sem uma nova linha. Isso permite que você atualize a saída sem ter centenas de linhas de saída. Usando essa base, você pode encontrar uma maneira de imprimir lentamente uma seta, como =>25% ==>50% ===>75% , em vez de simplesmente imprimir um número. Você poderia fazer isso de uma maneira muito básica usando a lógica if-then para imprimir um número específico de = dependendo do tamanho do número.

    
por 30.09.2013 / 06:47
1

Caso você queira ver o progresso de um processo de cópia de arquivos, você pode simplesmente usar

pv source_file > destination_file

ou

rsync --progress source_file destination_file

em vez do comando cp

    
por 30.09.2013 / 07:23
1

Aqui está um usando movimentos do cursor que reescreverão a linha para mostrar um contagem regressiva:

c=5 # seconds to wait
REWRITE="\e[25D\e[1A\e[K"
echo "Starting..."
while [ $c -gt 0 ]; do 
    c=$((c-1))
    sleep 1
    echo -e "${REWRITE}$c"
done
echo -e "${REWRITE}Done."
    
por 30.09.2013 / 10:03