dpkg-query
comme dans votre article lié semble être l'outil le plus correct pour le travail, sauf en utilisant par exemple les bibliothèques Python disponibles pour se lier directement au système APT dans un tel contexte de script.
Avec dpkg-query
:
dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'
Renvoie true (état de sortie 0
dans le script shell) si le package est installé, false (état de sortie 1
) sinon.
-W
signifie "Afficher" ( dpkg-query
doit avoir une action demandée).
-f
change le format de la sortie.
db:Status-abbrev
est la forme abrégée du statut du package.
2>/dev/null
fait taire dpkg-query
si un nom de package non valide est donné. La façon dont cela devrait être géré pourrait être une question au cas par cas.
grep -q
renvoie vrai s'il y a correspondance, faux sinon.
S'il est souvent utilisé, il pourrait devenir une simple fonction:
#!/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
ou tout simplement
#!/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 Andersson
la source
dpkg-query -l "$package" | grep -q ^.i
c'est généralement suffisant (et plus facile à retenir).dpkg-query -l
sortie n'est pas figée car il s'agit simplement d'un mode de présentation utilisateur, donc si la présentation change, un tel script pourrait se casser.dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*'
dans le même sens.J'ai testé les suggestions de Daniel sur trois packages avec ces résultats:
Paquet de référentiel Debian natif non installé:
Package PPA enregistré sur l'hôte et installé:
Package PPA enregistré sur l'hôte mais non installé:
Bien que j'aime l'approche, il semble que je ne puisse pas faire confiance au code de retour avec les packages PPA. Bref, je pense que je vais m'en tenir à l'analyse du retour de la
apt-cache policy
commande.la source
grep
partie de votre collage. Je ne peux pas vraiment reproduire votre problème, mais cela peut être dû au fait que les exemples de code sont actuellement incomplets, veuillez donc corriger cela. Exécutez-vous Debian ou Ubuntu?grep
joué dans la commande, vous l'avez donc supprimé et maintenant vous dites que cela ne fonctionne pas?grep -q
donne le code retour1
s'il ne correspond pas , c'est-à-dire que le programme n'est pas installé ou indisponible, ou0
si le programme est installé. Je l'ai expliqué dans mon post.la source
DEPS=$(echo {dialog,sqlite3,openssh-client})
peut être écrit de manière équivalente comme justeDEPS="dialog sqlite3 openssh-client"
.J'aime la réponse de Daniel Andersson, mais cela n'a pas fonctionné pour moi. Je suis sur Ubuntu 12.04.
Depuis la page de manuel de dpkg ,
db:Status-abbrev
ne fonctionne que dans dpkg 1.16.2+:Ma solution a été d'utiliser un comportement hérité, juste le
Status
formateur:les sorties
Je suppose que c'était l'inspiration de "ii" dans d'autres représentations.
Donc, pour adapter complètement la réponse de Daniel Andersson pour travailler sur une ancienne version de dpkg, et donc sur des distributions Ubuntu plus anciennes:
Retour:
la source