Cómo verificar desde bash si el paquete existe en Debian


12

Me gustaría escribir un script bash de instalación, donde me gustaría instalar el servidor MySQL.

En Linux Mint había seguido el código:

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

pero instalé el nuevo Debian 8 y no hay mysql-server, en su lugar lo hay mariadb.

¿Cómo puedo saber si el paquete existe?

Solo sé que hay lo dpkg -sque debería decir si un paquete está instalado.


3
--force-yesdesactiva toda la seguridad, por lo que realmente podría romper su sistema hasta el punto de no repararlo. También: --force-yesanula (desactiva) -y. donde esta última podría ser la opción de elección: una forma larga de -yes --assume-yes, y eso es lo que hace; Decir que sí hasta que pueda ponerse realmente feo, con el riesgo de estragos entre los elementos centrales, los fundamentos, etc., --forceanula la seguridad (lo aprendí de la manera difícil)
erch

Anexo: Tal vez le interese la --simulateopción para apt-get, por si --dry-runacaso , hacer una , por
favor

1
solo para aclarar: desea saber si un paquete está en alguno de los repositorios definidos /etc/apt/sources.list, ¿no?
wullxz

Tenga en cuenta que en realidad hay un paquete mysql-server en Debian 8, junto con mariadb: packages.debian.org/jessie/mysql-server
Dan Getz

Respuestas:


13

(el siguiente es de Ubuntu, pero la misma técnica obviamente también funciona en 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 el paquete existe, se mostrará la información. Si no, verás algo como:

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

Además, el código de salida de apt-cacheserá distinto de cero si no se encuentran paquetes coincidentes.

Nota adicional: si está utilizando apt-cache show packagedonde el paquete es virtual (uno que no existe, pero que, por ejemplo, hace referencia a otros paquetes), obtendrá:

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

El exit codede esto es cero (que es un poco engañoso en mi opinión).


3
sólo para completar esta respuesta: también se puede buscar en los repositorios definidos desde el sources.listcon este comando: apt-cache search *searchstring*. Ese comando también buscará la descripción de los paquetes y podría ayudarlo a encontrar paquetes donde no sepa el nombre exacto del paquete.
wullxz

1
@wullxz, solo el apt-cache search ...devuelve cualquier tipo de coincidencias y la aplicación. devuelve 0 incluso si no se encuentra nada, lo que no es práctico en un script bash.
Alexis Wilke

4

Me gustaría utilizar dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed".

Verificará si el mysql-serverpaquete está instalado y, de ser así, imprime este hecho en la pantalla. Una solución más sofisticada sería, en bash (no probado):

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

Entonces uno puede hacer en un script:

if ! package_exists mysql-server ; then
    echo Please install mysql-server!"
fi

55
Creo que quiere saber si el paquete existe y no si ya está instalado en la máquina local ...
wullxz

0

En una sola línea:

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

sale con 0 si está presente, 1 si no.

Bonificación: verificación eficiente para múltiples paquetes, enumerados en el archivo "packages_we_want", uno por línea, ordenados con sort:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantenumera todos los paquetes que desea, pero que no existen en los repositorios.

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want enumera todos los paquetes que desea y existen en los repositorios.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.