쉘 스크립트가 얼마나 많은 출력을 완료했는지 알려주는 진행 표시줄

쉘 스크립트가 얼마나 많은 출력을 완료했는지 알려주는 진행 표시줄

다음 쉘 스크립트가 있습니다패키지 이름이 주어지고 깔끔하게 존재하도록 스크립트의 출력을 내림차순으로 정리합니다.-

┌─[shirish@debian] - [~] - [6348]
└─[$] cat find-interesting-patches.sh 

for source in $(dpkg-query --show -f \
 '${source:Package}\n' | sort -u); do bts \
 select source:${source} tag:patch \
| sed  "s/^/${source} /g"; done 

stdout에서 출력을 얻습니다.

┌─[shirish@debian] - [~] - [6349]
└─[$]./find-interesting-patches.sh

2048-qt 781691
abootimg 725728
accountsservice 805989
acl 677570
acpi 772688
acpi-support 823072
acr 772194

이제 패키지 수가 제한되어 있다는 것을 알고 있습니다. 예를 들어 4k 이상입니다.

$dpkg -l > dpkg-l.txt

그런 다음

$wc dpkg-l.txt 

전체 she-bang의 줄 번호와 단어 수를 제공합니다.

스크립트를 실행할 때 진행률 표시줄을 표시하여 완료 정도를 알 수 있는 방법이 있습니까? 내가 찾고 있어요https://stackoverflow.com/questions/238073/how-to-add-a-progress-bar-to-a-shell-script#238094몇 가지 방법을 시도했지만 성공하지 못했습니다. 예를 들어, pv를 시도했지만 끔찍하게 실패했습니다.

┌─[shirish@debian] - [~] - [6353]
└─[$] pv ./find-interesting-patches.sh

for source in $(dpkg-query --show -f \
 '${source:Package}\n' | sort -u); do bts \
 select source:${source} tag:patch \
| sed  "s/^/${source} /g"; done 
 153 B 0:00:00 [9.09KiB/s] [=================================================================================================>] 100% 

내가 기대했던 것과는 다릅니다. 내가 뭘 잘못하고 있는지 아는 사람 있나요?

답변1

당신이 줄 때pvcat명령줄 인수인 파일은 파일 처럼 작동 하고 표시하며 해당 출력의 진행 상황을 추적합니다. 이 양식은 pv파이프를 사용하여 느린 프로세스에 파일을 공급하려는 경우 유용합니다. 맨페이지에 예제가 있습니다.

출력 저장을 고려할 수도 있습니다.

dpkg-query --show -f '${source:Package}\n' | sort -u

파일에 추가하고 이를 사용하면 pv루프 호출에 피드되지만 bts select결과 파일이 너무 짧아서 버퍼링되고 pv실제로 처리가 시작되기 전에 처리된 것으로 생각합니다.

따라서 진행 상황을 수동으로 추적해야 합니다.

#!/bin/sh
file=$(mktemp)
dpkg-query --show -f '${source:Package}\n' | sort -u > ${file}
lines=$(wc -l ${file} | cut -f1 -d\ )
line=0
while read source; do
    line=$((line + 1))
    printf "Processing line %d / %d\r" ${line} ${lines} >&2
    bts select source:${source} tag:patch | sed "s/^/${source} /g"
done < ${file} | sort -k2,2n -r
rm ${file}
echo "Done                           " >&2

다음 예제를 사용하여 멋진 진행률 표시줄을 사용하도록 조정하겠습니다.쉘 스크립트에 진행 표시줄을 추가하는 방법은 무엇입니까?.

답변2

명령의 시간을 정하면 다음을 사용할 수 있습니다.이 진행 표시줄

사용하시면 원활하겠습니다반자

여기에 이미지 설명을 입력하세요.

항상 사용할 수 없는 또 다른 옵션은 시간을 기준으로 하지 않고 스크립트의 특정 지점을 기준으로 진행률 표시줄을 업데이트하는 것입니다.

code set_progress 10 code set_progress 20 ... code set_progress 100

관련 정보