ver tengo saber paquetes paquete nombre instalados instalado hat esta comprobar como bash shell apt-get

bash - tengo - ver paquetes instalados de php



Compruebe si un paquete está instalado y luego instálelo si no está (16)

Estoy trabajando en un sistema Ubuntu y actualmente esto es lo que estoy haciendo:

if ! which command > /dev/null; then echo -e "Command not found! Install? (y/n) /c" read if "$REPLY" = "y"; then sudo apt-get install command fi fi

¿Es esto lo que la mayoría de la gente haría? ¿O hay una solución más elegante?


Esta característica ya existe en Ubuntu y Debian, en el paquete de command-not-found .


Este comando es el más memorable:

dpkg --get-selections <package-name>

Si está instalado, imprime:

<paquete-nombre> instalar

De lo contrario, imprime

No se encontraron paquetes que coincidan con <package-name>.

Esto fue probado en Ubuntu 12.04.1 (Precise Pangolin).


Este one-liner devuelve 1 (instalado) o 0 (no instalado) para el paquete ''nano''.

$(dpkg-query -W -f=''${Status}'' nano 2>/dev/null | grep -c "ok installed")

incluso si el paquete no existe / no está disponible.

El siguiente ejemplo instala el paquete ''nano'' si no está instalado.

if [ $(dpkg-query -W -f=''${Status}'' nano 2>/dev/null | grep -c "ok installed") -eq 0 ]; then apt-get install nano; fi


Esto lo hará. apt-get install es idempotente.

sudo apt-get install command


Esto parece funcionar bastante bien.

$ sudo dpkg-query -l | grep <some_package_name> | wc -l

  • Devuelve 0 si no está instalado o algún número > 0 si está instalado.

He encontrado que todas las soluciones anteriores pueden producir un falso positivo si se instala un paquete y luego se elimina, pero el paquete de instalación permanece en el sistema.

Para replicar: Instalar el paquete apt-get install curl
Eliminar paquete apt-get remove curl

Ahora prueba las respuestas anteriores.

El siguiente comando parece resolver esta condición:
dpkg-query -W -f=''${Status}/n'' curl | head -n1 | awk ''{print $3;}'' | grep -q ''^installed$''

Esto dará como resultado una instalación definitiva o no instalada


Me he decidido por uno basado en la respuesta de Nultyi :

MISSING=$(dpkg --get-selections $PACKAGES 2>&1 | grep -v ''install$'' | awk ''{ print $6 }'') # Optional check here to skip bothering with apt-get if $MISSING is empty sudo apt-get install $MISSING

Básicamente, el mensaje de error de dpkg --get-selections es mucho más fácil de analizar que la mayoría de los demás, porque no incluye estados como "deinstall". También puede verificar múltiples paquetes simultáneamente, algo que no se puede hacer solo con los códigos de error.

Explicación / ejemplo:

$ dpkg --get-selections python3-venv python3-dev screen build-essential jq dpkg: no packages found matching python3-venv dpkg: no packages found matching python3-dev screen install build-essential install dpkg: no packages found matching jq

Entonces grep elimina los paquetes instalados de la lista y awk extrae los nombres de los paquetes del mensaje de error, lo que da como resultado MISSING=''python3-venv python3-dev jq'' , que puede insertarse trivialmente en un comando de instalación.

No estoy emitiendo ciegamente un paquete apt-get install $PACKAGES porque como se menciona en los comentarios, esto puede inesperadamente actualizar paquetes que no planeabas; realmente no es una buena idea para procesos automatizados que se espera que sean estables.


Ofrezco esta actualización ya que Ubuntu agregó su "Archivo de paquete personal" (PPA) justo cuando se respondió esta pregunta, y los paquetes de PPA tienen un resultado diferente.

  1. Paquete de repositorio nativo de Debian no instalado:

    ~$ dpkg-query -l apache-perl ~$ echo $? 1

  2. Paquete PPA registrado en el host e instalado:

    ~$ dpkg-query -l libreoffice ~$ echo $? 0

  3. Paquete de PPA registrado en el host pero no instalado:

    ~$ dpkg-query -l domy-ce ~$ echo $? 0 ~$ sudo apt-get remove domy-ce [sudo] password for user: Reading package lists... Done Building dependency tree Reading state information... Done Package domy-ce is not installed, so not removed 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

También publicado en: https://superuser.com/questions/427318/test-if-a-package-is-installed-in-apt/427898


Para Ubuntu, apt proporciona una forma bastante decente de hacer esto. A continuación se muestra un ejemplo de Google Chrome:

if apt -qq list google-chrome-stable 2>/dev/null | grep -q installed ; then apt-get install google-chrome-stable fi

Estoy redirigiendo la salida de error a nulo porque apt advierte contra el uso de su "cli inestable". Sospecho que el paquete de la lista es estable, así que creo que está bien descartar esta advertencia. El -qq hace que sea súper silencioso.


Para ser un poco más explícito, aquí hay un poco de script bash que busca un paquete y lo instala si es necesario. Por supuesto, puede hacer otras cosas al descubrir que falta el paquete, como simplemente salir con un código de error.

PKG_OK=$(dpkg-query -W --showformat=''${Status}/n'' the.package.name|grep "install ok installed") echo Checking for somelib: $PKG_OK if [ "" == "$PKG_OK" ]; then echo "No somelib. Setting up somelib." sudo apt-get --force-yes --yes install the.package.name fi

Si la secuencia de comandos se ejecuta dentro de una GUI (por ejemplo, es una secuencia de comandos Nautilus), es probable que desee reemplazar la invocación ''sudo'' con una ''gksudo''.


Para verificar si el nombre del packagename fue instalado, escriba:

dpkg -s <packagename>

También puede usar dpkg-query que tiene una salida más ordenada para su propósito, y acepta comodines también.

dpkg-query -l <packagename>

Para encontrar qué paquete posee el command , intente:

dpkg -S `which <command>`

Para obtener más detalles, consulte el artículo Averigüe si el paquete está instalado en Linux y en la hoja de información de dpkg .


UpAndAdam escribió:

Sin embargo, no puede simplemente confiar en los códigos de retorno aquí para scripting

Según mi experiencia, puedes confiar en los códigos de salida de dkpg.

El código de retorno de dpkg -s es 0 si el paquete está instalado y 1 si no es así, por lo que la solución más simple que encontré fue:

dpkg -s <pkg-name> 2>/dev/null >/dev/null || sudo apt-get -y install <pkg-name>

Funciona bien para mí ...


Utilizar:

apt-cache policy <package_name>

Si no está instalado, mostrará:

Installed: none

De lo contrario, mostrará:

Installed: version


$name="rsync" [ `which $name` ] $$ echo "$name : installed" || sudo apt-get install -y $name


apt list [packagename]

parece ser la forma más simple de hacerlo fuera de dpkg y antiguas herramientas apt- *


which <command> if [ $? == 1 ]; then <pkg-manager> -y install <command> fi