Exibir uma barra de progresso enquanto esperamos o retorno de um processo

Exibir uma barra de progresso enquanto esperamos o retorno de um processo

Estou olhando para esta respostaaquie gostaria de implementar a barra de progresso enquanto espero a execução de um processo - ou no meu caso - muitos.

Estou executando várias cópias de sistemas de arquivos grandes em paralelo usando o seguinte trecho

for svol in "${svols[@]}";
do
    syslog_info "copying $svol"
    ${CP} -p $svol $somedir &
done
syslog_info "Parallel copy ongoing..."
wait

e pretendo adicionar a barra de progresso para exibir enquanto aguardo o retorno dos processos em segundo plano.

Esta é a minha tentativa, alguém pode me dizer onde estou errando ou ajudar a fazer funcionar?

for svol in "${svols[@]}";
do
    syslog_info "copying $svol"
    ${CP} -p $svol $somedir &
done
syslog_info "Parallel copy ongoing..."

i=1
sp="/-\|"
echo -n ' '

until wait;
do
    printf "\b${sp:i++%${#sp}:1}"
    sleep 0.1
done

EDIT: atualizei o código original nesta questão para uma solução funcional testada - ainda tentando executá-lo até que a espera retorne

Por outro lado, não - o código original na parte superior funciona bem como está e o trecho a seguir também funciona como um trecho de código independente

i=1
sp="/-\|"
echo -n ' '

for i in {1..100};
do
    printf "\b${sp:i++%${#sp}:1}"
    sleep 0.1
done

Responder1

waitbloqueia até que todos os trabalhos em segundo plano tenham retornado, portanto você não pode usá-lo como untilcondição, pois será executado apenas uma vez.

Você poderia usar [ -n "$(jobs)" ]para ver se há trabalhos em execução:

while [ -n "$(jobs)" ]; do
  printf "\b${sp:i++%${#sp}:1}"
  sleep 0.1
done

Responder2

No GNU/Linux, você pode usaroVisualizador de progresso do Coreutils( progress, anteriormente conhecido como cv):

"${CP}" -p -- "$svol" "$somedir" & progress -mp "$!"

informação relacionada