셸 스크립트의 진행 표시기

7954 단어
스크립트나 프로그램이 오래 실행될 때 단말기 사용자에게 피드백 정보를 제공하는 것은 스크립트나 프로그램이 부지런히 일하고 있음을 나타낸다.본고는 흔히 볼 수 있는 두 가지 진도 지시기(일련의 원점과 회전선)와 진도 지시를 제공하는 다른 도구를 소개할 것이다.
1. 일련의 원점을 사용하여 진도를 표시한다
  !/bin/bash function dots(){ seconds=${1:-5} # print a dot every 5 seconds by default while true do      sleep $seconds      echo -n '.' done }
  dots 10 & BG_PID=$! trap "kill -9 $BG_PID" INT
  # Do the real job here sleep 150 kill $BG_PID echo
dots 함수는 일정 시간마다 원점을 인쇄합니다. 이 시간 값은 첫 번째 파라미터를 통해 전송할 수 있습니다. 그렇지 않으면 기본값은 5초입니다.백그라운드에서dots 함수를 시작한 후 "$!"을 통해dots의pid를 가져와서 시간 소모된 작업을 시작합니다. 작업이 끝난 후에kill에서 백엔드에서dots를 실행합니다.trap 명령은 사용자 Ctrl 을 방지하기 위한 것입니다.C 스크립트 실행을 중단할 때dots는 백엔드에서 실행됩니다.
2. 진행률을 표시하기 위해 회전선을 사용한다.
  #!/bin/bash

function
rotate(){ INTERVAL=0.5 RCOUNT= "0" echo -n 'Processing' while : do      ((RCOUNT = RCOUNT + 1))      case $RCOUNT in          1) echo -e '-\b\c'              sleep $INTERVAL              ;;          2) echo -e '\\\b\c'              sleep $INTERVAL              ;;          3) echo -e '|\b\c'              sleep $INTERVAL              ;;          4) echo -e '/\b\c'              sleep $INTERVAL              ;;          *) RCOUNT=0              ;;      esac done } rotate & trap "kill -9 $BG_PID" INT ROTATE_PID=$!
  # Do the job here sleep 15 kill -9 $ROTATE_PID echo
진행률 표시기로 회전선을 사용하려면/-\| 를 순서대로 표시한 다음 반복할 수 있습니다.이 문자열을 빈틈없이 표시하려면, 앞의 문자를 체크아웃하고 삭제하거나, 새로운 문자로 덮어쓰십시오. 선이 회전하는 것처럼 보일 수 있습니다.
3. pv로 진도 표시
pv(Pipe Viewer)는 파이프를 통한 내용의 데이터 통과 과량, 데이터 통과 속도, 사용 시간, 예상 남은 시간(ETA), 통과 백분율 등의 정보를 표시할 수 있다.사용할 때 pv를 두 프로세스의 파이프 사이에 꽂고 적절한 매개 변수를 제공할 수 있습니다.예를 들어 tar 백업 속도를 보기 위해
  tar czf - /path/to/some/directory/ *  | pv > backup. tar .gz
cp의 속도를 보기 위해
  file = /path/to/some/file size=` ls -sk $ file | awk '{print $1}' ` && pv -s ${size}k $ file > /desination/filename
4. dialog를 사용하여 진도 dialog를 표시하는 것은 셸 스크립트에 대화상자를 표시하는 도구로 제공하는 --gauge는 진도 표시줄로 사용할 수 있으며 진도 크기는 표준 입력에서 읽을 수 있습니다.다음은 간단한 예입니다.
  for i in $( seq 0 10 100) ; do sleep 1; echo $i | dialog --gauge "Please wait" 10 70 0; done
다음 스크립트는cp진도에 대한 디스플레이를 제공합니다
  #!/bin/bash file =$1 newfile=$2 filename=` basename $ file ` if [ -d $newfile ]; then      newfile=$newfile/$filename fi cp $ file $newfile & CP_PID=$! trap 'kill -9 $CP_PID' INT size_old=`stat -c "%s" $ file ` size_new=`stat -c "%s" $newfile` ( while [ $size_new -lt $size_old ]; do      echo "$size_new * 100 / $size_old" | bc      sleep 1      size_new=`stat -c "%s" $newfile` done ) | dialog --title "File Copy" --gauge "cp $file $newfile" 10 70 0
5. CP에 진행 상태 표시를 제공하는 또 다른 방법은 다음과 같습니다.
  #!/bin/sh cp_p() {     strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \        | awk '{          count += $NF              if (count % 10 == 0) {                 percent = count / total_size * 100                 printf "%3d%% [" , percent                 for (i=0;i<=percent;i++)                    printf "="                 printf ">"                 for (i=percent;i<100;i++)                    printf " "                 printf "]\r"              }           }           END { print "" } ' total_size=$(stat -c ' %s' "${1}" ) count=0 }

좋은 웹페이지 즐겨찾기