패키지가 APT에 설치되어 있는지 테스트 세부 정보가 필요하지

패키지가 설치되어 있으면 쉘 스크립트 메소드를 테스트 /보고하고 싶습니다. 논리 흐름을 설정하기 위해 세부 정보가 필요하지 않고 부울 리턴 만 필요합니다. 나는 보았다 패키지가 설치되어있는 경우 찾기dpkg반환 복잡한 출력 및 형식 변경이 패키지는 데비안 저장소에 또는 우분투 PPA에 있는지 여부에 따라 달라집니다.

나는 그것이 apt-cache꽤 잘 작동 한다는 것을 알았고이 방법을 생각해 냈습니다.

is_installed=0
test_installed=( `apt-cache policy package-name | grep "Installed:" ` )
[ ! "${test_installed[1]}" == "(none)" ] && is_installed=1

누구나 더 간단하거나 직접적인 방법을 알고 있습니까?



답변

dpkg-query 링크 된 게시물에서와 같이 사용 가능한 Python 라이브러리를 사용하여 이러한 스크립팅 컨텍스트에서 APT 시스템에 직접 바인딩하는 것을 제외하고는 작업에 가장 적합한 도구 인 것처럼 보입니다.

dpkg-query:

dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'

0패키지가 설치된 경우 true ( 셸 스크립트의 종료 상태 1)를 반환하고, 그렇지 않으면 false (종료 상태 )를 반환합니다.

  • -W“표시”를 의미 dpkg-query합니다 ( 요청 된 조치가 있어야 함).
  • -f 출력 형식을 변경합니다.
  • db:Status-abbrev 패키지 상태의 짧은 형식입니다.
  • 2>/dev/nulldpkg-query유효하지 않은 패키지 이름이 제공되면 침묵 합니다. 이 문제를 처리하는 방법은 사례마다 다를 수 있습니다.
  • grep -q 일치하는 것이 있으면 true를, 그렇지 않으면 false를 반환합니다.

자주 사용하는 경우 간단한 기능으로 만들 수 있습니다.

#!/bin/sh
debInst() {
    dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'
}

if debInst "$1"; then
    printf 'Why yes, the package %s _is_ installed!\n' "$1"
else
    printf 'I regret to inform you that the package %s is not currently installed.\n' "$1"
fi

아니면 그냥

#!/bin/sh
if dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'; then
    printf 'Why yes, the package "%s" _is_ installed!\n' "$1"
else
    printf 'I regret to inform you that the package "%s" is not currently installed.\n' "$1"
fi

답변

다음과 같은 세 가지 패키지에 대한 Daniel의 제안을 테스트했습니다.

  1. 네이티브 데비안 저장소 패키지가 설치되지 않았습니다 :

    ~$ dpkg-query -Wf'${db:Status-abbrev}' apache-perl
    ~$ echo $?
    1
    
  2. 호스트에 등록되어 설치된 PPA 패키지 :

    ~$ dpkg-query -Wf'${db:Status-abbrev}' libreoffice
    ~$ echo $?
    0
    
  3. 호스트에 등록되었지만 설치되지 않은 PPA 패키지 :

    ~$ dpkg-query -Wf'${db:Status-abbrev}' domy-ce
    ~$ echo $?
    0
    ~$ sudo apt-get remove domy-ce
    [sudo] password for user:
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    Package domy-ce is not installed, so not removed
    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
    

접근 방식이 마음에 들지만 PPA 패키지로 리턴 코드를 신뢰할 수없는 것 같습니다. 그것의 부족으로, 나는 apt-cache policy명령 의 반환을 파싱하는 것을 고수 할 것이라고 생각합니다 .


답변

#!/bin/bash

# Check for dependencies
check_deps () {
DEPS=$(echo {dialog,sqlite3,openssh-client})
for i in $DEPS ; do
    dpkg-query -W -f='${Package}\n' | grep ^$i$ > /dev/null
    if [ $? != 0 ] ; then
        echo "Installing deps ..."
        aptitude install $i -y > /dev/null
    fi
done
}

# execute the check_deps function
check_deps

답변

나는 Daniel Andersson의 대답이 마음에 들지만 효과가 없었습니다. 우분투 12.04에 있습니다.

로부터 dpkg를 man 페이지 , db:Status-abbrev단지 1.16.2+ dpkg를 작동합니다

          db:Status-Abbrev
                 It  contains the abbreviated package status, such as “ii”
                 (since dpkg 1.16.2).

내 솔루션은 레거시 동작을 사용하고 Status포맷터 만 사용하는 것이 었습니다 .

dpkg-query -Wf'${Status}' {my_pkg_name}

출력

install ok installed

나는 이것이 다른 표현에서 “ii”에 대한 영감이라고 생각합니다.

따라서 Daniel Andersson의 답변을 이전 버전의 dpkg 및 이전 Ubuntu 배포판에서 작동하도록 완전히 조정하려면 다음을 수행하십시오.

dpkg-query -Wf'${Status}' {your_pkg_name} 2>/dev/null | grep -q "install ok installed"

보고:

  • 0-패키지가 설치되었거나
  • 1-패키지가 설치되지 않았습니다.