패키지가 설치되어 있으면 쉘 스크립트 메소드를 테스트 /보고하고 싶습니다. 논리 흐름을 설정하기 위해 세부 정보가 필요하지 않고 부울 리턴 만 필요합니다. 나는 보았다 패키지가 설치되어있는 경우 찾기 만 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의 제안을 테스트했습니다.
- 
네이티브 데비안 저장소 패키지가 설치되지 않았습니다 :
~$ dpkg-query -Wf'${db:Status-abbrev}' apache-perl ~$ echo $? 1 - 
호스트에 등록되어 설치된 PPA 패키지 :
~$ dpkg-query -Wf'${db:Status-abbrev}' libreoffice ~$ echo $? 0 - 
호스트에 등록되었지만 설치되지 않은 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-패키지가 설치되지 않았습니다.