dpkg-query
jak w twoim łączonym poście wydaje się być najbardziej odpowiednim narzędziem dla zadania, z wyjątkiem użycia np. dostępnych bibliotek Pythona do bezpośredniego łączenia się z systemem APT w takim kontekście skryptowym.
Z dpkg-query
:
dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'
Zwraca true (kod wyjścia 0
w skrypcie powłoki), jeśli pakiet jest zainstalowany, false (kod wyjścia 1
) w przeciwnym razie.
-W
oznacza „Pokaż” ( dpkg-query
musi mieć wymagane działanie).
-f
zmienia format wyniku.
db:Status-abbrev
jest krótką formą statusu paczki.
2>/dev/null
wycisza się, dpkg-query
jeśli podana zostanie niepoprawna nazwa pakietu. Sposób, w jaki należy to rozwiązać, może być kwestią indywidualną.
grep -q
zwraca true, jeśli istnieje dopasowanie, false w przeciwnym razie.
Jeśli jest często używany, można go uczynić prostą funkcją:
#!/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
lub po prostu
#!/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
dpkg-query -l "$package" | grep -q ^.i
jest to zwykle wystarczające (i łatwiejsze do zapamiętania).dpkg-query -l
wynik nie jest ustawiony, ponieważ jest to tylko tryb prezentacji użytkownika, więc jeśli prezentacja się zmieni, być może taki skrypt się zepsuje.dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*'
z tym samym skutkiem.Testowałem sugestie Daniela dotyczące trzech pakietów z następującymi wynikami:
Natywny pakiet repozytorium Debiana nie został zainstalowany:
Pakiet PPA zarejestrowany na hoście i zainstalowany:
Pakiet PPA zarejestrowany na hoście, ale nie zainstalowany:
Chociaż podoba mi się to podejście, wydaje się, że nie mogę ufać kodowi zwrotnemu z pakietami PPA. Krótko mówiąc, myślę, że pozostanę przy analizie powrotu
apt-cache policy
polecenia.źródło
grep
część swojego wklejania. Naprawdę nie mogę odtworzyć Twojego problemu, ale może to być spowodowane tym, że przykłady kodu są obecnie niekompletne, więc napraw to. Czy korzystasz z Debiana lub Ubuntu?grep
odgrywaną w poleceniu, więc ją rozebrałeś, a teraz mówisz, że to nie działa?grep -q
podaje kod powrotu,1
jeśli nie pasuje, tj. program nie jest zainstalowany lub niedostępny, lub0
jeśli program jest zainstalowany. Wyjaśniłem to w moim poście.źródło
DEPS=$(echo {dialog,sqlite3,openssh-client})
można napisać równorzędnie jako sprawiedliwyDEPS="dialog sqlite3 openssh-client"
.Podoba mi się odpowiedź Daniela Anderssona, ale dla mnie to nie zadziałało. Jestem na Ubuntu 12.04.
Od strony man dpkg ,
db:Status-abbrev
działa tylko w dpkg 1.16.2+:Moim rozwiązaniem było użycie starszego zachowania, tylko
Status
formatyzator:wyjścia
Zgaduję, że to była inspiracja dla „ii” w innych przedstawieniach.
Tak więc, aby całkowicie dostosować odpowiedź Daniela Anderssona do pracy nad starszą wersją dpkg, a tym samym starszymi dystrybucjami Ubuntu:
Zwroty:
źródło