barra de progresso para saber quanta saída do script de shell foi feita

1

Eu tenho o seguinte shell-script de limpeza de saída de um script para que ele seja decrescente, forneça nomes de pacotes e exista claramente -

┌─[shirish@debian] - [~] - [6348]
└─[$] cat find-interesting-patches.sh 

for source in $(dpkg-query --show -f \
 '${source:Package}\n' | sort -u); do bts \
 select source:${source} tag:patch \
| sed  "s/^/${source} /g"; done 

e recebo a saída no stdout.

┌─[shirish@debian] - [~] - [6349]
└─[$]./find-interesting-patches.sh

2048-qt 781691
abootimg 725728
accountsservice 805989
acl 677570
acpi 772688
acpi-support 823072
acr 772194

Agora eu sei que o número de pacotes é finito, por exemplo, é 4k e um pouco mais de fazer

$dpkg -l > dpkg-l.txt

e depois

$wc dpkg-l.txt 

que dá números de linha, numero de palavras toda a she-bang.

Quando eu executo o script, há uma maneira de ter uma barra de progresso para que eu saiba o quanto ela foi concluída. Eu olhei para link e tentei algumas das coisas, mas eles não funcionaram. Por exemplo eu tentei pv e ele falhou espetacularmente -

┌─[shirish@debian] - [~] - [6353]
└─[$] pv ./find-interesting-patches.sh

for source in $(dpkg-query --show -f \
 '${source:Package}\n' | sort -u); do bts \
 select source:${source} tag:patch \
| sed  "s/^/${source} /g"; done 
 153 B 0:00:00 [9.09KiB/s] [=================================================================================================>] 100% 

Não é o que eu esperava, alguém sabe o que estou fazendo de errado?

    
por shirish 23.11.2016 / 23:39

2 respostas

2

Quando você der um pv um arquivo como argumento de linha de comando, age como cat e exibe o arquivo e rastreia o progresso dessa saída, que é o que você está vendo. Esse formulário é útil se você estiver usando pv para alimentar um arquivo para um processo lento (usando um pipe); a manpage tem exemplos.

Você pode pensar em salvar a saída de

dpkg-query --show -f '${source:Package}\n' | sort -u

para um arquivo e usando pv para alimentar isso para um loop chamando bts select , mas o arquivo resultante é tão curto que fica armazenado em buffer e pv considera que foi processado antes do processamento começar.

Você precisa acompanhar o progresso manualmente:

#!/bin/sh
file=$(mktemp)
dpkg-query --show -f '${source:Package}\n' | sort -u > ${file}
lines=$(wc -l ${file} | cut -f1 -d\ )
line=0
while read source; do
    line=$((line + 1))
    printf "Processing line %d / %d\r" ${line} ${lines} >&2
    bts select source:${source} tag:patch | sed "s/^/${source} /g"
done < ${file} | sort -k2,2n -r
rm ${file}
echo "Done                           " >&2

Vou deixar você adaptar isso para usar uma boa barra de progresso, usando os exemplos em Como adicionar uma barra de progresso a um shell roteiro? .

    
por 24.11.2016 / 09:44
1

Se você cronometrar o comando, você pode usar esta barra de progresso

Ele funciona sem problemas usando caracteres de meio bloco

Exemplo

Outra opção que nem sempre está disponível é atualizar a barra de progresso não com base no tempo, mas em determinados pontos do seu script.

code set_progress 10 code set_progress 20 ... code set_progress 100

    
por 19.07.2017 / 10:20