プロセスが戻るのを待つ間に進行状況バーを表示する

プロセスが戻るのを待つ間に進行状況バーを表示する

私はこの答えを見ていますここそして、プロセスの実行を待つ間 (私の場合は複数のプロセスの実行) に進行状況バーを実装したいと思います。

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

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

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

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

関連情報