패키지가 설치되어 있으면 쉘 스크립트 메소드를 테스트 /보고하고 싶습니다. 논리 흐름을 설정하기 위해 세부 정보가 필요하지 않고 부울 리턴 만 필요합니다. 나는 보았다 패키지가 설치되어있는 경우 찾기 만 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/null
dpkg-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-패키지가 설치되지 않았습니다.