함수 명령 실행에 따른 진행 상황을 보여주는 진행률 표시줄 "대화상자"

함수 명령 실행에 따른 진행 상황을 보여주는 진행률 표시줄 "대화상자"

각 echo 명령이 함수에서 실행될 때 "대화 상자" 진행률 표시줄이 카운터를 증가시키도록 하려면 어떻게 해야 합니까?

예시로 아래 코드가 있는데, 함수 명령 실행 시 캡처에 문제가 발생합니다. 함수에서 "에코"의 수를 세고 "항목"으로 설정할 수 있지만, 에코가 언제 끝나는지 어떻게 알 수 있고 막대를 어떻게 증가시킬 수 있나요?

#!/bin/bash
function two() {
   echo "test2-1"; sleep 1;
   echo "test2-2"; sleep 1;
   echo "test2-3"; sleep 1;
   echo "test2-4"; sleep 1;
   echo "test2-5"; sleep 1;
}

(
    items=5
    processed=0
    while [ $processed -le $items ]; do
        pct=$(( $processed * 100 / $items ))
        echo "XXX"
        echo "Processing item $processed" # Here I wish instead $processed
                                          # to be value (test2-1, test2-2 etc.)
                                          # of processed echo
        echo "XXX"
        echo "$pct"
        processed=$((processed+1))
        sleep 3 # Instead of this it should be when echo is finished printing
    done
) | dialog --title "Gauge" --gauge "Wait please..." 10 60 0

답변1

일반적인 구문은 다음과 같습니다.dialog --gauge

이 데모 스크립트는 대화 상자에 진행 상황을 표시하는 방법을 보여줍니다.

#!/bin/bash

( echo 10;sleep 1;echo 50;sleep 1; echo 90;sleep 1;echo 100;sleep 1 ) | dialog --gauge 'text' 10 60 0
echo '##########'
i=0; while [ $i -le 100 ];do echo "$i";echo "#comment $i";i=$((i+10));sleep 1;done
echo '##########'
i=0; while [ $i -le 100 ];do echo "$i";echo "#comment $i";i=$((i+10));sleep 1;done| dialog --gauge 'text' 10 60 0
  • 숫자 0-100의 출력을 사용하십시오.
  • 다른 출력에는 # 접두사가 붙고 주석으로 처리되므로 혼동이 없습니다 dialog. # 접두사 없이 숫자가 아닌 문자(텍스트 줄)도 처리할 수 있지만 예상치 못한 일이 발생할 수 있습니다.

다른 출력이 있는 경우 이를 캡처하고 처리한 후 관련 값만 0-100으로 파이프해야 합니다 dialog.

편집: 알려진 출력 라인 수

다음 스크립트에서는 다음을 가정합니다.알려진 출력 라인 수(이 경우 5) 완료될 때까지 이 기능을 사용하여 actor공급합니다 dialog.

#!/bin/bash

expected_outputs=5
ii=0

function two() {
   echo "test2-1"; sleep 1;
   echo "test2-2"; sleep 1;
   echo "test2-3"; sleep 1;
   echo "test2-4"; sleep 1;
   echo "test2-5"; sleep 1;
}

function actor () {
while read ans
do
    echo "# $ans"
    ii=$((ii+1))
    echo $((ii*100/expected_outputs))
done
}

# main

two | actor

two | actor | dialog --title "Gauge" --gauge "Wait please..." 10 60 0

편집 2:zenity --progress

그래픽 데스크탑 환경에서는 다음과 일치하는 명령줄을 사용할 수 있습니다 zenity.

two | actor | zenity --progress --title "Gauge" --text="string" --percentage=0 --auto-close --width=300

관련 정보