apt-get은 종료 상태를 업데이트합니다.

apt-get은 종료 상태를 업데이트합니다.

상태를 확인하는 방법은 무엇입니까 apt-get update?

$ apt-get update ; echo "status is: $?"

Err http://security.debian.org stable/updates Release.gpg
Could not resolve 'security.debian.org'
Hit http://192.168.1.100 stable Release.gpg
Hit http://192.168.1.100 stable Release
Hit http://192.168.1.100 stable/main i386 Packages
Hit http://192.168.1.100 stable/contrib i386 Packages
Hit http://192.168.1.100 stable/non-free i386 Packages
Ign http://192.168.1.100 stable/contrib Translation-en
Ign http://192.168.1.100 stable/main Translation-en
Ign http://192.168.1.100 stable/non-free Translation-en
Reading package lists... Done
W: Failed to fetch http://security.debian.org/dists/stable/updates/Release.gpg  Could not resolve 'security.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.

status is: 0

보안 업데이트를 가져오는 동안 오류가 발생했지만 종료 상태는 0입니다.

내 목표는 apt-get update가 올바르게 실행되고 있는지 확인하는 스크립트입니다.

답변1

이러한 경고를 오류로 바꾸려면 이 적절한 옵션을 사용하십시오.

apt-get update -o APT::Update::Error-Mode=any

원하는 경우 conf 파일에서 설정할 수도 있습니다.

답변2

귀하의 예에서는 apt-get update문제를 치명적인 오류가 아닌 경고로 처리하므로 오류 종료가 없습니다. 치명적인 오류가 발생하면 0이 아닌 상태로 종료됩니다.

이상 현상을 식별하는 한 가지 방법은 다음 패턴을 확인하는 것입니다 stderr.

  • W:다음으로 시작하는 줄
  • E:다음으로 시작하는 줄

apt-get update위의 패턴이 일치하거나 종료 코드가 0이 아닌 경우 다음과 같은 방법을 사용하여 실패를 시뮬레이션할 수 있습니다.

if ! { sudo apt-get update 2>&1 || echo E: update failed; } | grep -q '^[WE]:'; then
    echo success
else
    echo failure
fi

!패턴이 일치 하면 , 즉 오류가 있으면 성공적으로 종료되기 때문 if입니다 . grep오류가 없으면 grep자동으로 실패합니다 . 따라서 if조건은 음수 종료 코드입니다 grep.

답변3

apt-get의 out/err을 먹지 않으려면(예를 들어 로그 파일에 쓰는 경우) 이것이 더 쉬운 옵션일 수 있습니다.

sudo apt-get update 2>&1 | tee /tmp/apt.err && ! grep -q '^[WE]' /tmp/apt.err

나중에 삭제할 새 파일을 남기지 않으면 좋겠지만 grep을 tee 출력으로 바꾸면 종료 코드를 가져오기가 더 어려울 것 같습니다.

답변4

특수 변수 $?를 사용하여 마지막 명령의 종료 상태를 확인할 수 있습니다. 오류 출력을 먼저 표준 출력으로 리디렉션할 수도 있습니다.

OUTPUT=`apt-get update 2>&1`

if [[ $? != 0 ]]; then
  echo "$OUTPUT"
fi

관련 정보