我正在看這個答案這裡我想在等待進程運行時實現進度條 - 或者在我的情況下 - 很多。
我使用以下程式碼片段並行運行大型檔案系統的多個副本
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 "$!"