dpkg-query
wie in Ihrem verlinkten Beitrag scheint das korrekteste Werkzeug für den Job zu sein, außer dass Sie beispielsweise die verfügbaren Python-Bibliotheken verwenden, um in einem solchen Skriptkontext direkt an das APT-System zu binden.
Mit dpkg-query
:
dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'
Gibt true zurück (Exit-Status 0
im Shell-Skript), wenn das Paket installiert ist, 1
andernfalls false (Exit-Status ).
-W
bedeutet "Anzeigen" ( dpkg-query
muss eine angeforderte Aktion haben).
-f
ändert das Format der Ausgabe.
db:Status-abbrev
ist die Kurzform des Paketstatus.
2>/dev/null
Stummschalten, dpkg-query
wenn ein ungültiger Paketname angegeben wird. Wie damit umgegangen werden soll, kann von Fall zu Fall sein.
grep -q
Gibt true zurück, wenn eine Übereinstimmung vorliegt, andernfalls false.
Wenn es häufig verwendet wird, kann es zu einer einfachen Funktion gemacht werden:
#!/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
oder einfach nur
#!/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
normalerweise ausreichend ist (und leichter zu merken ist).dpkg-query -l
Ausgabe nicht in Stein gemeißelt, da es sich nur um einen Benutzerpräsentationsmodus handelt. Wenn sich die Präsentation ändert, kann ein solches Skript möglicherweise beschädigt werden.dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*'
mit dem gleichen Effekt.Ich habe Daniels Vorschläge an drei Paketen mit folgenden Ergebnissen getestet:
Native Debian-Repository-Paket nicht installiert:
Auf dem Host registriertes und installiertes PPA-Paket:
Auf dem Host registriertes, aber nicht installiertes PPA-Paket:
Obwohl mir der Ansatz gefällt, kann ich dem Rückkehrcode bei PPA-Paketen anscheinend nicht vertrauen. Abgesehen davon denke ich, dass ich mich daran halten werde, die Rückgabe des
apt-cache policy
Befehls zu analysieren .quelle
grep
Teil in Ihrem Einfügen verpasst . Ich kann Ihr Problem nicht wirklich reproduzieren, aber das könnte daran liegen, dass die Codebeispiele derzeit unvollständig sind. Beheben Sie das bitte. Führen Sie Debian oder Ubuntu aus?grep
im Befehl gespielte Rolle verstanden haben , also haben Sie sie entfernt, und jetzt sagen Sie, dass sie nicht funktioniert?grep -q
gibt den Rückkehrcode zurück,1
wenn er nicht übereinstimmt, dh das Programm nicht installiert oder nicht verfügbar ist oder0
wenn das Programm installiert ist. Das habe ich in meinem Beitrag erklärt.quelle
DEPS=$(echo {dialog,sqlite3,openssh-client})
kann gleichwertig als gerecht geschrieben werdenDEPS="dialog sqlite3 openssh-client"
.Ich mag Daniel Anderssons Antwort, aber es hat bei mir nicht funktioniert. Ich bin auf Ubuntu 12.04.
Von der dpkg - man - Seite ,
db:Status-abbrev
funktioniert nur in dpkg 1.16.2+:Meine Lösung bestand darin, altes Verhalten zu verwenden, nur den
Status
Formatierer:Ausgänge
Ich vermute, dies war die Inspiration für "ii" in anderen Darstellungen.
Um Daniel Anderssons Antwort vollständig an die Arbeit an älteren Versionen von dpkg und damit an älteren Ubuntu-Distributionen anzupassen:
Kehrt zurück:
quelle