고급 셸 프로 그래 밍 가이드 학습 노트 (3) - "다 중 스 레 드"/작업 제어: tar 압축 풀기 진도 바
우선 대본 을 올 립 니 다.이 스 크 립 트 의 기능 은 tar 명령 으로 압축 파일 을 풀 때 진행 바 를 표시 하 는 것 입 니 다.
#!/bin/bash
#Tarprogressbar.sh
# tar
FILE="test.tar.gz"
TOTAL_SIZE=0
for FILE_SIZE in $(tar tvvf $FILE | awk '{print $3}'); do
if [ "$FILE_SIZE" = "${FILE_SIZE//[^0-9]/}" ]; then
TOTAL_SIZE=$((TOTAL_SIZE+FILE_SIZE))
fi
done
TMPFIFO=/tmp/tmpfifo &> /dev/null
if [[ -f $TMPFIFO ]];then
:
else
mkfifo $TMPFIFO &> /dev/null
fi
(
TOTAL_FILE_SIZE_UNZIP=0
{
p=1
while read line
do
FILE_SIZE_UNZIP=$(echo $line | awk '{print $3}')
((TOTAL_FILE_SIZE_UNZIP=$TOTAL_FILE_SIZE_UNZIP+$FILE_SIZE_UNZIP))
echo $((TOTAL_FILE_SIZE_UNZIP*100/TOTAL_SIZE))
done$TMPFIFO 2>/dev/null
wait $B_PID
echo " unzip ended successfully. "
실현 방향:
다음 부분 은 코드 를 처음부터 정리 하 겠 습 니 다.
TOTAL_SIZE=0
for FILE_SIZE in $(tar tvvf $FILE | awk '{print $3}'); do
if [ "$FILE_SIZE" = "${FILE_SIZE//[^0-9]/}" ]; then
TOTAL_SIZE=$((TOTAL_SIZE+FILE_SIZE))
fi
done
이 단락 은 압축 된 가방 안의 파일 의 전체 크기 를 계산 하기 위해 서 입 니 다. 사실은 압축 된 가방 이 압축 을 푸 는 과정 입 니 다. 파일 이 풀 리 지 않 았 을 뿐 awk 명령 을 통 해 출력 정 보 를 얻 은 세 번 째 열의 파일 크기 를 합 쳐 계산 합 니 다.
TMPFIFO=/tmp/tmpfifo &> /dev/null
if [[ -f $TMPFIFO ]];then
:
else
mkfifo $TMPFIFO &> /dev/null
fi
여기 가 바로 파 이 프 를 만 드 는 것 이 니 할 말 이 별로 없다.
(
TOTAL_FILE_SIZE_UNZIP=0
{
p=1
while read line
do
FILE_SIZE_UNZIP=$(echo $line | awk '{print $3}')
((TOTAL_FILE_SIZE_UNZIP=$TOTAL_FILE_SIZE_UNZIP+$FILE_SIZE_UNZIP))
echo $((TOTAL_FILE_SIZE_UNZIP*100/TOTAL_SIZE))
done$TMPFIFO 2>/dev/null
wait $B_PID
echo " unzip ended successfully. "
이 단락 은 핵심 코드 다.먼저 괄호 가 묶 인 부분 을 보면 명령 집합 을 표시 하고 괄호 안에 괄호 가 하나 더 있 습 니 다. 괄호 가 묶 인 부분 은 파 이 프 를 통 해 whiptail 명령 으로 진도 바 를 출력 하기 위 한 백분율 매개 변수 입 니 다.괄호 의 끝 에 '&' 기호 가 있 는데 괄호 안의 명령 집합 을 배경 으로 실행 하고 그 후의 명령 은 실행 이 끝 날 때 까지 기다 리 지 않 아 도 작업 을 시작 할 수 있 음 을 나타 낸다."$!"는 이전 과정의 프로 세 스 번호 나 작업 번 호 를 표시 합 니 다. 여 기 는 사실 작업 번 호 를 표시 합 니 다.뒤에 실 행 된 명령 이 이 값 을 새로 고치 지 않도록 변수 로 저장 합 니 다.다음
tar zxvvf $FILE -C /opt >$TMPFIFO 2>/dev/null
압축 을 푸 는 과정 에서 출력 정 보 를 파이프 TMPFIFO 에 전 달 했 습 니 다.
우리 다시 돌아 보 자.
while read line
do
FILE_SIZE_UNZIP=$(echo $line | awk '{print $3}')
((TOTAL_FILE_SIZE_UNZIP=$TOTAL_FILE_SIZE_UNZIP+$FILE_SIZE_UNZIP))
echo $((TOTAL_FILE_SIZE_UNZIP*100/TOTAL_SIZE))
done
이 while 순환 뒤에 TMPFIFO 에서 데 이 터 를 읽 는 것 을 의미 하 는 리 셋 플래그 가 있 습 니 다. 그러면 압축 해제 과정의 정 보 를 배경 작업 에 전달 하고 백분율 을 계산 하 며 매개 변수 로 whiptail 명령 에 전달 하 는 것 을 교묘 하 게 실현 합 니 다.
wait $B_PID
wait 의 역할 은 B 까지 스 크 립 트 의 실행 을 중단 시 키 는 것 입 니 다.스 크 립 트 가 끝 났 을 때 애니메이션 이 새로 고침 되 지 않도록 PID 대표 의 작업 이 끝나 고 계속 실 행 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.