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?
command -v <command>
; nowhich <command>
. También vea Verificar si existe un programa desde un script Bash .Respuestas:
Para verificar si
packagename
se instaló, escriba:También puede usar el
dpkg-query
que tenga una salida más ordenada para su propósito y también acepte comodines.Para encontrar qué paquete posee
command
, intente:Para más detalles, vea el artículo Averigüe si el paquete está instalado en Linux y dpkg cheat sheet .
fuente
if
uso. También estoy buscandoif
uso.dpkg -s
devuelve 1 en paquetes faltantes y 0 en caso contrario, como debería ser. ¿Cómo fue diferente en versiones anteriores (o recientes)?dpkg -s
devuelve cero si se instaló un paquete y luego se eliminó, en ese caso esStatus: deinstall ok config-files
o similar, por lo que está "bien", así que para mí, esta no es una prueba segura.dpkg-query -l
tampoco parece devolver un resultado útil en este caso.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.
Si el script se ejecuta dentro de una GUI (por ejemplo, es un script de Nautilus), es probable que desee reemplazar la invocación 'sudo' por una 'gksudo'.
fuente
--force-yes
Parece una mala idea. De la página de manual: "Esta es una opción peligrosa que hará que apt-get continúe sin avisar si está haciendo algo potencialmente dañino. No debe usarse excepto en situaciones muy especiales. El uso de --force-yes puede potencialmente destruir su sistema ! " Usarlo en un script lo hace aún peor.Este one-liner devuelve 1 (instalado) o 0 (no instalado) para el paquete 'nano'.
incluso si el paquete no existe / no está disponible.
El siguiente ejemplo instala el paquete 'nano' si no está instalado.
fuente
dpkg-query -W -f='${Status}' MYPACKAGE | grep -q -P '^install ok installed$'; echo $?
grep -P
una expresión regular simple como esa.if ! dpkg-query -W -f='${Status}' nano | grep "ok installed"; then apt install nano; fi
- No es necesario usargrep -c
, solo use el estado de salida degrep
dpkg -s
uso programático con instalación automáticaMe gusta
dpkg -s
ya que sale con estado1
si alguno de los paquetes no está instalado, lo que facilita la automatización:man dpkg
lamentablemente no documenta el estado de salida, pero creo que debería ser razonablemente seguro confiar en él:Una cosa a tener en cuenta es que se ejecuta:
no necesariamente elimina todos los archivos de inmediato para algunos paquetes (pero lo hace para otros, ¿no está seguro de por qué?), y solo marca el paquete para su eliminación.
En este estado, el paquete parece seguir siendo utilizable, y como sus archivos todavía están presentes, pero está marcado para su eliminación más adelante.
Por ejemplo, si ejecuta:
luego:
los dos primeros
echo $?
resultados0
, solo la tercera salida1
la salida para el primero
dpkg -s certbot
contiene:mientras que el segundo dice:
y solo desaparece después de la purga:
el archivo
/etc/logrotate.d/certbot
todavía está presente en el sistema después deapt remove
, pero no después--purge
.Sin embargo, el archivo
/usr/lib/python3/dist-packages/certbot/reporter.py
todavía está presente incluso después--purge
.No entiendo por qué, pero con el
hello
paquete el segundodpkg
despuésapt remove
muestra que el paquete ya se ha eliminado sin--purge
:Las documentaciones también son muy poco claras, por ejemplo:
no se eliminó
certbot
cuando se marcó comodeinstall
, aunqueman apt-get
parece indicar que:Ver también:
Probado en Ubuntu 19.10.
Pitón
apt
PaqueteHay un paquete de Python 3 preinstalado llamado
apt
en Ubuntu 18.04 que expone una interfaz de Python apt!Un script que verifica si un paquete está instalado y lo instala si no se puede ver en: Cómo instalar un paquete usando la API python-apt
Aquí hay una copia para referencia:
Compruebe si hay un ejecutable en su
PATH
lugarVer: ¿Cómo puedo verificar si un programa existe desde un script Bash?
fuente
sudo apt install hello; dpkg -s hello; echo $?; sudo apt remove hello; dpkg -s hello; echo $?
. ¿Pueden proporcionar más detalles?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.
Paquete de repositorio nativo de Debian no instalado:
Paquete PPA registrado en el host e instalado:
Paquete PPA registrado en el host pero no instalado:
También publicado en: /superuser/427318/test-if-a-package-is-installed-in-apt/427898
fuente
UpAndAdam escribió:
En mi experiencia, puede 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 lo está, por lo que la solución más simple que encontré fue:
Funciona bien para mi ...
fuente
apt-get remove <package>
,dpkg -s <package>
aún devuelve 0, aunque el paquete esdeinstalled
Esto parece funcionar bastante bien.
0
si no está instalado o algún número> 0
si está instalado.fuente
grep | wc -l
Es un antipatrón. Para verificar si algo existe, simplemente deseagrep -q
. Para contar realmente las ocurrencias (que rara vez es útil en este tipo de escenario), usegrep -c
.dpkg -s zip | grep -c "Package: zip"
? (usando zip como paquete de muestra)grep -q 'Package: zip'
devolver un código de salida que indique si se encontró o no el resultado sin imprimir nada.Me decidí por uno basado en la respuesta de Nultyi :
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 "desinstalar". También puede verificar múltiples paquetes simultáneamente, algo que no puede hacer con solo códigos de error.Explicación / ejemplo:
Por lo tanto, grep elimina los paquetes instalados de la lista y awk extrae los nombres de los paquetes del mensaje de error, lo
MISSING='python3-venv python3-dev jq'
que se puede insertar trivialmente en un comando de instalación.No estoy emitiendo ciegamente
apt-get install $PACKAGES
porque, como se menciona en los comentarios, esto puede actualizar inesperadamente paquetes que no estaba planeando; No es realmente una buena idea para procesos automatizados que se espera que sean estables.fuente
[[ ! -z $MISSING ]] && sudo apt-get install $MISSING
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 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
fuente
config-files
, por lo que creo que| grep -q "installed"
realmente se necesita una final para obtener un estado de código de salida funcional.| grep -q '^installed$'
Parece que hoy en día
apt-get
tiene una opción--no-upgrade
que simplemente hace lo que quiere el OP:Página de manual de https://linux.die.net/man/8/apt-get
Por lo tanto, puedes usar
y
package
se instalará solo si no es así.fuente
fuente
command -v <command>
; nowhich <command>
. También vea Verificar si existe un programa desde un script Bash .Esto lo hará.
apt-get install
es idempotentefuente
apt-get install
paquete no es deseable cuando el paquete ya está instalado, aunque el comando en sí sea idempotente. En mi caso, estoy instalando un paquete en un sistema remoto con el módulo sin procesar de Ansible, que informará que el sistema cambiará cada vez que lo ejecuteapt-get install
indiscriminadamente. Un condicional resuelve ese problema.Utilizar:
Si no está instalado, mostrará:
De lo contrario, mostrará:
fuente
Esta característica ya existe en Ubuntu y Debian, en el
command-not-found
paquete.fuente
command-not-found
es un ayudante interactivo, no una herramienta para garantizar que tenga las dependencias que desea. Por supuesto, la forma correcta de declarar dependencias es empaquetar su software en un paquete Debian y completar laDepends:
declaración en eldebian/control
archivo del paquete correctamente.parece ser la forma más sencilla de hacerlo fuera de dpkg y herramientas apt- * anteriores
fuente
fuente
command -v <command>
; nowhich <command>
. También vea Verificar si existe un programa desde un script Bash .Tuve un requisito similar al ejecutar la prueba localmente en lugar de en Docker. Básicamente, solo quería instalar los archivos .deb encontrados si aún no estaban instalados.
Supongo que el único problema que puedo ver es que no comprueba el número de versión del paquete, por lo que si el archivo .deb es una versión más nueva, esto no sobrescribirá el paquete instalado actualmente.
fuente
Para Ubuntu, apt proporciona una forma bastante decente de hacer esto. A continuación se muestra un ejemplo para Google Chrome:
apt -qq list google-chrome-stable 2>/dev/null | grep -qE "(installed|upgradeable)" || apt-get install google-chrome-stable
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.
fuente
Este comando es el más memorable:
Si está instalado, imprime:
De lo contrario, imprime
Esto fue probado en Ubuntu 12.04.1 (Precise Pangolin).
fuente
dpkg --get-selections <package-name>
no establece el código de salida en distinto de cero cuando no se encuentra el paquete.Se han contado muchas cosas, pero para mí la forma más simple es:
fuente
En Bash:
Tenga en cuenta que puede tener una cadena con varios paquetes en PKG.
fuente
Yo uso la siguiente manera:
fuente