プロセスが返されるのを待っている間に進行状況バーを表示する

プロセスが返されるのを待っている間に進行状況バーを表示する

この答えを見ています。ここプロセスが実行されるのを待っている間(私の場合は)進行状況バーを実装したいと思います。

次のコードスニペットを使用して、大規模ファイルシステムの複数のコピーを並列に実行します。

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

編集:この質問の元のコードをテスト済みの作業ソリューションに更新しました。待機が返されるまで実行を続けます。

一方、上部の元のコードはうまく機能し、次のコードフラグメントもスタンドアロンコードフラグメントとして機能します。

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

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

答え1

waituntilすべてのバックグラウンドジョブが返されるまでブロックされるため、一度だけ実行されるため、条件として使用できません。

次のコマンドを使用して、[ -n "$(jobs)" ]実行中のジョブがあるかどうかを確認できます。

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

答え2

GNU/Linux では、以下を使用できます。これCoreutilsプログレスビューアprogress、以前はとして知られているcv:

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

関連情報