각 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