Отображение индикатора выполнения во время ожидания завершения процесса

Отображение индикатора выполнения во время ожидания завершения процесса

Я смотрю на этот ответздесьи я хотел бы реализовать индикатор выполнения, пока я жду запуска процесса (или, в моем случае, нескольких).

Я запускаю несколько копий больших файловых систем параллельно, используя следующий фрагмент

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 "$!"

Связанный контент