보다 간결한 방식으로 wget 전송을 표시합니다(오류 감지 기능은 유지하면서).

보다 간결한 방식으로 wget 전송을 표시합니다(오류 감지 기능은 유지하면서).

wget에는 진행률 표시줄을 표시하거나 표시하지 않는 몇 가지 옵션이 있다는 것을 알고 있습니다.

wget 전송을 더 짧은 방법, 즉 백분율 또는 동적인 방법으로 표시하고 싶지만 이미 출력이 있는 스크립트에 삽입해야 하기 때문에 기존 wget 출력만큼 ​​많은 공간을 차지하지 않습니다.

내 목표는 사용자에게 파일이 다운로드되고 있음을 보여주고 속도까지 보여주되 스크립트의 전체적인 모양을 너무 많이 망치지는 않는 것입니다.

중요한:내 wget 단락은 if then else 스크립트 안에 있으므로 오류 감지를 유지해야 합니다.

내 스크립트에는 다음과 같은 블록이 있습니다.

if wget -O filename http://someurl then
    some_action
else
    some_other_action
fi

누군가 이런 종류의 개선이 포함된 사용자 정의 진행 데이터 또는 막대의 흥미로운 예를 제공할 수 있습니까? 감사해요;)

답변1

다음과 같이 "점" 진행률 출력 스타일을 사용하는 경우:

   500K .......... .......... .......... .......... ..........  2%  496K 91s

awk그런 다음 stderr에서 이와 유사한 파일 로 파이프하고 마지막 2개 열에 표시된 "2%" 필드만 인쇄할 수 있습니다 .

wget ... --progress=dot -q --show-progress 2>&1 |
awk 'NF>2 && $(NF-2) ~ /%/{printf "\r %s",$(NF-2)} END{print "\r    "}'

행에 변경된 백분율 값이 표시되며 결국 지워집니다.


wget에 대한 반환 코드를 유지하려면 if..else스크립트에서 다음을 설정하여 파이프가 실패한 명령(가장 오른쪽 명령뿐만 아니라)에 대한 오류 코드를 반환하도록 bash에 요청할 수 있습니다.

set -o pipefail

또는 주석에서 제안한 대로 모든 if..else..fi코드를 블록 안에 변경하지 않고 끝에 있는 stderr을 더 유익한 awk로 파이프할 수 있습니다.

( if wget ...
  fi
  if wget ...
  fi
  if wget ...
  fi
) 2>&1 | awk '
/^Saving to:/ { fn = gensub(/^Saving to: /,"",1) }
NF>2 && $(NF-2) ~ /%/ { printf "\r%s %s",fn,$(NF-2) }
END { gsub(/./," ",fn); print "\r    " fn }'

또는 stderr에서 중요한 오류 메시지를 잃지 않으려면 모든 wget 명령의 stderr를 세 번째 파일 설명자로 리디렉션하세요.

( if wget ... 2>&3
  then ... else ... fi
  if wget ... 2>&3
  then ... else ... fi
  if wget ... 2>&3
  then ... else ... fi
) 3>&1 | awk ...

관련 정보