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 ...