¿Cómo puedo saber si un paquete está instalado a través de yum en un script bash?

76

Estoy tratando de escribir un script que instale paquetes, pero si falla en algún momento más adelante, el script revierte lo que haya instalado. Por supuesto, si el usuario ya ha instalado previamente un paquete, no quiero desinstalarlo debajo de ellos. ¿Cómo puede mi script decir si un paquete se ha instalado previamente a través de yum?

Doktor J
fuente

Respuestas:

77

Encontré lo siguiente en una pregunta de StackOverflow semi-relacionada ; la respuesta que necesitaba no respondía realmente la pregunta allí (y no fue seleccionada como la respuesta correcta), así que pensé que la publicaría aquí para que otros la encuentren más fácilmente.

yum list installed PACKAGE_NAME

Este comando devuelve algunos resultados legibles por humanos, pero lo más importante es que devuelve un código de estado de salida; 0 indica que el paquete está instalado, 1 indica que el paquete no está instalado (no comprueba si el paquete es válido, por yum list installed herpderp-beepbopbooplo que devolverá un "1" igual yum list installed tracerouteque si no tiene instalado traceroute). Posteriormente puede marcar "$?" para este código de salida

Como la salida es algo contraria a la intuición, utilicé la versión "condensada" de @Chris Downs a continuación en una función de envoltura para hacer que la salida sea más "lógica" (es decir, 1 = instalada 0 = no instalada):

function isinstalled {
  if yum list installed "$@" >/dev/null 2>&1; then
    true
  else
    false
  fi
}

el uso sería

if isinstalled $package; then echo "installed"; else echo "not installed"; fi

EDITAR:

Se reemplazaron las returndeclaraciones con llamadas a truey falseque ayudan a que la función sea más legible / intuitiva, al tiempo que devuelve los valores que bash espera (es decir, 0 para verdadero, 1 para falso).

Si solo está buscando un paquete en su script, es mejor que pruebe yum list installeddirectamente, pero (en mi humilde opinión) la función hace que sea más fácil de entender lo que está sucediendo, y su sintaxis es mucho más fácil de recordar que yumcon todos los redireccionamientos para suprimir su salida.

Doktor J
fuente
2
No necesita verificar manualmente el valor de $?, simplemente ajuste el comando en un condicional:if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Down
1
Creo que tus declaraciones de eco se invierten, ¿no? isInstalleddevuelve 1 si el paquete está instalado; pero 1 se evalúa como falso en bash, por lo que se repite "no instalado".
FGreg
@FGreg buena llamada ... He reemplazado las returndeclaraciones con llamadas a truey false, por lo que la función es fácil de leer pero devuelve el resultado que bash espera.
Doktor J
55
Dios mío, es el siglo XXI, ¿no pueden tener una opción adecuada para saber si un paquete está instalado, por lo que no tengo funciones de escritura o un revestimiento?
Sunil D.
21

No cumple exactamente la condición previa de la pregunta "vía yum" pero más rápido que "yum -q list" es:

rpm -q <package_name>

que devuelve el nombre exacto de la versión posiblemente instalada, así como el código de error "0" si está instalado y "1" si no lo está.

Gerald Schade
fuente
+1 porque esto es más rápido
Freddie Fabregas
Definitivamente más rápido, porque rpmes el administrador de paquetes local. yumes para tratar con paquetes en repositorios remotos
Sergiy Kolodyazhnyy
9

Línea simple:

yum -q list installed packageX &>/dev/null && echo "Installed" || echo "Not installed"
Zlemini
fuente
0

Un script útil para yum:

#!/bin/sh pckarr=(wget mlocate bind-utils ANY_RANDOM_PACKAGE_NAME) yum update -y for i in ${pckarr[*]} do isinstalled=$(rpm -q $i) if [ ! "$isinstalled" == "package $i is not installed" ]; then echo Package $i already installed else echo $i is not INSTALLED!!!! yum install $i -y fi done updatedb

En la matriz de pckarr, enumere los paquetes que desea instalar o compruebe si está instalado.

Ashish K Srivastava
fuente
0

También puede leer el valor de retorno $?de yum. Debería ser 0 si todo funcionó o fue positivo dependiendo del tipo de problemas con los que se encontró. Esta es una buena manera si desea tomar diferentes medidas si algo falla.

Fiebre
fuente