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
packagenamese instaló, escriba:También puede usar el
dpkg-queryque 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
ifuso. También estoy buscandoifuso.dpkg -sdevuelve 1 en paquetes faltantes y 0 en caso contrario, como debería ser. ¿Cómo fue diferente en versiones anteriores (o recientes)?dpkg -sdevuelve cero si se instaló un paquete y luego se eliminó, en ese caso esStatus: deinstall ok config-fileso similar, por lo que está "bien", así que para mí, esta no es una prueba segura.dpkg-query -ltampoco 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-yesParece 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 -Puna 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 degrepdpkg -suso programático con instalación automáticaMe gusta
dpkg -sya que sale con estado1si alguno de los paquetes no está instalado, lo que facilita la automatización:man dpkglamentablemente 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 salida1la salida para el primero
dpkg -s certbotcontiene:mientras que el segundo dice:
y solo desaparece después de la purga:
el archivo
/etc/logrotate.d/certbottodaví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.pytodavía está presente incluso después--purge.No entiendo por qué, pero con el
hellopaquete el segundodpkgdespuésapt removemuestra que el paquete ya se ha eliminado sin--purge:Las documentaciones también son muy poco claras, por ejemplo:
no se eliminó
certbotcuando se marcó comodeinstall, aunqueman apt-getparece indicar que:Ver también:
Probado en Ubuntu 19.10.
Pitón
aptPaqueteHay un paquete de Python 3 preinstalado llamado
apten 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
PATHlugarVer: ¿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 esdeinstalledEsto parece funcionar bastante bien.
0si no está instalado o algún número> 0si está instalado.fuente
grep | wc -lEs 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-selectionses 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 $PACKAGESporque, 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 $MISSINGHe 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 curlEliminar paquete
apt-get remove curlAhora 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-gettiene una opción--no-upgradeque 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
packagese 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 installes idempotentefuente
apt-get installpaquete 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 installindiscriminadamente. 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-foundpaquete.fuente
command-not-foundes 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/controlarchivo 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-stableEstoy 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