설치 중인 데비안 패키지에 대한 테스트 스크립트를 작성하고 싶습니다.
일치하는 패키지가 없는 경우 를 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에 발생하는 모든 오류를 인쇄할 것이라고 믿습니다.