프로세스가 반환될 때까지 기다리는 동안 진행률 표시줄을 표시합니다.

프로세스가 반환될 때까지 기다리는 동안 진행률 표시줄을 표시합니다.

이 답변을 보고 있어요여기프로세스가 실행될 때까지 기다리는 동안 진행률 표시줄을 구현하고 싶습니다. 제 경우에는 여러 프로세스가 실행될 때까지 기다리는 중입니다.

다음 코드 조각을 사용하여 대규모 파일 시스템의 여러 복사본을 병렬로 실행하고 있습니다.

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

관련 정보