我正在看这个答案这里我想在等待进程运行时实现进度条 - 或者在我的情况下 - 很多。
我使用以下代码片段并行运行大型文件系统的多个副本
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 "$!"