설치된 데비안 패키지에 대한 테스트 스크립트 작성 - 오류 처리?

설치된 데비안 패키지에 대한 테스트 스크립트 작성 - 오류 처리?

설치 중인 데비안 패키지에 대한 테스트 스크립트를 작성하고 싶습니다.

일치하는 패키지가 없는 경우 를 dpkg-query사용하여 검색하면 오류가 반환됩니다. 하지만 이를 구체적으로 감지하고 다른 오류(예: 리소스 소진)가 발생하면 중단하고 싶은 경우 어떻게 해야 할지 모르겠습니다.

답변1

dpkg-query실제로 이를 수행할 수 있는 옵션이 있으며 해당 종료 코드는 사용 사례를 지원합니다.

-s,--status package-name...

지정된 패키지의 상태를 보고합니다. 설치된 패키지의 상태 데이터베이스에 있는 항목만 표시됩니다. 여러 항목이 나열되면 package-name 요청된 상태 항목은 매개변수 목록에 지정된 것과 동일한 순서로 빈 줄로 구분됩니다.

(참고로 다음과 같습니다.설치됨패키지 상태 데이터베이스가 설치되지 않은 항목을 보고할 수 없도록 합니다. 이는 사용자가 추구하는 것입니다.

종료 상태

0: 요청한 쿼리가 성공적으로 실행되었습니다.

1: 파일이나 패키지를 찾을 수 없기 때문에 요청한 쿼리가 완전히 또는 부분적으로 실패했습니다(예외 --control-path, --control-list이러한 --control-show오류는 치명적임).

2: 잘못된 명령줄 사용이나 시스템과의 상호 작용(예: 데이터베이스 액세스, 메모리 할당 등)으로 인해 발생한 치명적이거나 복구할 수 없는 오류입니다.

(Debian 8에 포함된 맨페이지에는 이에 대한 언급이 없지만 dpkg-query실제로 Debian 8에서도 이러한 동작이 발생합니다.)

그처럼

#!/bin/sh

dpkg-query -s package > /dev/null 2>&1
case $? in
0)
    echo $1 is installed
    ;;
1)
    echo $1 is not installed
    ;;
2)
    echo An error occurred
    ;;
esac

(함수가 되는 것)은 제가 이해한 것과 일치합니다.

답변2

dpkg-query는 매우 간단하며 맨페이지를 잠깐 살펴보면 이 기능을 직접 구현할 수 있는 옵션이 없음을 알 수 있습니다. 그래서

dpkg-query -W -f '${Package} ${State}\n' | grep "^my-package .* installed"

그러면 문제는 다음과 같이 단순화된다.파이프라인에서 오류 코드 캡처. 분명히 Unix 셸의 엄격한 오류 처리는 어색해집니다. 나는 순진하게 재치 있는 말을 듣기를 바랐습니다 :).

set -e

function pkg_is_installed() {
  PKG="$1"
  LISTF=$(mktemp)
  dpkg-query -W -f '${Package} ${State}\n' >$LISTF
  grep "^${PKG} .* installed$" $LISTF >/dev/null   
  GREP_RC=$?
  rm $LISTF

  # for even moar strict error handling
  test $GREP_RC == 0 -o $GREP_RC == 1

  return $GREP_RC
}

dpkg가 아직 요청한 패키지를 보지 못했다는 것이 유일한 "오류"인 경우 메시지 인쇄를 피하면서 이것이 stderr에 발생하는 모든 오류를 인쇄할 것이라고 믿습니다.

관련 정보