Comment vérifier depuis bash si le paquet existe dans Debian

12

Je voudrais écrire un script bash d'installation, où j'aimerais installer le serveur MySQL.

Sur Linux Mint, j'avais suivi le code:

apt-get -y --force-yes install mysql-server-5.6

mais j'ai installé la nouvelle Debian 8 et il n'y en a pas mysql-server- au lieu de cela mariadb.

Comment puis-je savoir si le package existe?

Je sais juste qu'il y en a dpkg -squi devrait dire si un paquet est installé.

Dusan Plavak
la source
3
--force-yesdésactive toute la sécurité, de sorte que vous pourriez vraiment casser votre système au point de ne plus pouvoir le réparer. Aussi: --force-yesremplace (désactive) -y. où ce dernier pourrait être l'option de choix: une longue forme de -yis --assume-yes, et c'est ce qu'il fait; Dire oui jusqu'à ce que cela devienne vraiment moche, avec des risques de ravage parmi les éléments de base, les fondamentaux, etc., --forceannule la sécurité (l'a appris à la dure)
erch
Addendum: Vous pourriez être intéressé par l' --simulateoption pour apt-get, faire un --dry-run, juste au cas où
erch
1
juste pour clarifier: vous voulez savoir si un package est dans l'un des référentiels définis dans /etc/apt/sources.list, non?
wullxz
Notez qu'il y a en fait un paquet mysql-server dans Debian 8, aux côtés de mariadb: packages.debian.org/jessie/mysql-server
Dan Getz

Réponses:

13

(ce qui suit est d'Ubuntu, mais la même technique fonctionne évidemment aussi sur Debian)

$ apt-cache show screen
Package: screen
Priority: optional
Section: misc
Installed-Size: 950
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Axel Beckert <abe@debian.org>
Architecture: amd64
Version: 4.1.0~20120320gitdb59704-9
Depends: libc6 (>= 2.15), libpam0g (>= 0.99.7.1), libtinfo5
Suggests: iselect (>= 1.4.0-1) | screenie | byobu
Filename: pool/main/s/screen/screen_4.1.0~20120320gitdb59704-9_amd64.deb
Size: 645730
...

Si le package existe, des informations seront affichées. Sinon, vous verrez quelque chose comme:

$ apt-cache show foobar
N: Unable to locate package foobar
E: No packages found

De plus, le code de sortie de apt-cachesera différent de zéro si aucun package correspondant n'est trouvé.

Remarque supplémentaire: si vous utilisez un apt-cache show packagepackage virtuel (celui qui n'existe pas, mais qui est, par exemple, référencé par d'autres packages), vous obtiendrez:

N: Can't select versions from package 'package' as it is purely virtual
N: No packages found

Le exit codede ceci est zéro (ce qui est un peu trompeur à mon avis.)

EEAA
la source
3
juste pour compléter cette réponse: vous pouvez également rechercher les référentiels définis de la sources.listavec cette commande: apt-cache search *searchstring*. Cette commande recherchera également la description des packages et pourrait vous aider à trouver des packages dont vous ne connaissez pas le nom exact.
wullxz
1
@wullxz, seul le apt-cache search ...retourne tout type de correspondance et l'application. renvoie 0 même si rien n'est trouvé, ce qui n'est pas pratique dans un script bash.
Alexis Wilke
4

J'utiliserais dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed".

Il vérifiera si le mysql-serverpackage est installé et si oui, il imprime ce fait à l'écran. Une solution plus sophistiquée serait, en bash (non testé):

function package_exists() {
    return dpkg -l "$1" &> /dev/null
}

On peut donc faire dans un script:

if ! package_exists mysql-server ; then
    echo Please install mysql-server!"
fi
Gergely Polonkai
la source
5
Je pense qu'il veut savoir si le paquet existe et pas s'il est déjà installé sur la machine locale ...
wullxz
0

Dans une doublure:

apt-cache pkgnames | grep -q "\<$your_package_name\>"

sort avec 0 s'il est présent, 1 sinon.

Bonus: vérification efficace de plusieurs packages, répertoriés dans le fichier "packages_we_want", un par ligne, triés avec sort:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantrépertorie tous les packages que vous souhaitez, mais qui n'existent pas dans les référentiels.

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want répertorie tous les packages que vous souhaitez et qui existent dans les référentiels.

Shnatsel
la source