當我們等待進程返回時顯示進度條

當我們等待進程返回時顯示進度條

我正在看這個答案這裡我想在等待進程運行時實現進度條 - 或者在我的情況下 - 很多。

我使用以下程式碼片段並行運行大型檔案系統的多個副本

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

相關內容