Я смотрю на этот ответздесьи я хотел бы реализовать индикатор выполнения, пока я жду запуска процесса (или, в моем случае, нескольких).
Я запускаю несколько копий больших файловых систем параллельно, используя следующий фрагмент
for svol in "${svols[@]}";
do
syslog_info "copying $svol"
${CP} -p $svol $somedir &
done
syslog_info "Parallel copy ongoing..."
wait
и я хочу добавить индикатор выполнения, чтобы он отображался, пока я жду, когда вернутся процессы в фоновом режиме.
Это моя попытка, может ли кто-нибудь подсказать, где я ошибаюсь, или помочь мне заставить это работать?
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: Я обновил исходный код в этом вопросе до проверенного рабочего решения — все еще пытаюсь заставить его работать, пока не вернется ожидание
Кстати, исходный код вверху работает нормально и так, а следующий фрагмент также работает как отдельный фрагмент кода.
i=1
sp="/-\|"
echo -n ' '
for i in {1..100};
do
printf "\b${sp:i++%${#sp}:1}"
sleep 0.1
done
решение1
wait
блокируется до тех пор, пока все фоновые задания не будут завершены, поэтому вы не можете использовать его в качестве until
условия, поскольку он будет выполнен только один раз.
Вместо этого вы можете использовать [ -n "$(jobs)" ]
, чтобы проверить, запущены ли у вас задания:
while [ -n "$(jobs)" ]; do
printf "\b${sp:i++%${#sp}:1}"
sleep 0.1
done
решение2
В GNU/Linux вы можете использоватьthe Просмотрщик хода выполнения Coreutils( progress
, ранее известный как cv
):
"${CP}" -p -- "$svol" "$somedir" & progress -mp "$!"