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
wait
bloqueia até que todos os trabalhos em segundo plano tenham retornado, portanto você não pode usá-lo como until
condiçã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 "$!"