dpkg-query como en su publicación vinculada parece ser la herramienta más correcta para el trabajo, excepto el uso, por ejemplo, de las bibliotecas de Python disponibles para enlazar directamente con el sistema APT en dicho contexto de secuencias de comandos.
Con dpkg-query:
dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'
Devolverá verdadero (estado de salida 0en el script de shell) si el paquete está instalado, falso (estado de salida 1) de lo contrario.
-Wsignifica "Mostrar" ( dpkg-querydebe tener una acción solicitada).
-f cambia el formato de la salida.
db:Status-abbrev es la forma abreviada del estado del paquete.
2>/dev/nullsilencia dpkg-querysi se da un nombre de paquete no válido. Cómo se debe manejar esto podría ser un problema de caso a caso.
grep -q devuelve verdadero si hay una coincidencia, falso de lo contrario.
Si se usa con frecuencia, podría hacerse una función simple:
#!/bin/sh
debInst() {
dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'
}
if debInst "$1"; then
printf 'Why yes, the package %s _is_ installed!\n' "$1"
else
printf 'I regret to inform you that the package %s is not currently installed.\n' "$1"
fi
o simplemente
#!/bin/sh
if dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'; then
printf 'Why yes, the package "%s" _is_ installed!\n' "$1"
else
printf 'I regret to inform you that the package "%s" is not currently installed.\n' "$1"
fi
dpkg-query -l "$package" | grep -q ^.isuele ser suficiente (y más fácil de recordar).dpkg-query -lsalida no se establece en piedra ya que es solo un modo de presentación del usuario, por lo que si la presentación cambia, tal secuencia de comandos podría romperse.dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*'para el mismo efecto.Probé las sugerencias de Daniel en tres paquetes con estos resultados:
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:
Aunque me gusta el enfoque, parece que no puedo confiar en el código de retorno con los paquetes PPA. Aparte de eso, creo que seguiré analizando el regreso del
apt-cache policycomando.fuente
grepparte de su pegado. Realmente no puedo reproducir su problema, pero eso podría deberse a que los ejemplos de código están actualmente incompletos, así que solucione eso. ¿Ejecutas Debian o Ubuntu?grepdesempeñado en el comando, ¿así que lo eliminaste y ahora dices que no funciona?grep -qda el código de retorno1si no coincide, es decir, el programa no está instalado o no está disponible, o0si el programa está instalado. Lo expliqué en mi publicación.fuente
DEPS=$(echo {dialog,sqlite3,openssh-client})se puede escribir de manera equivalente como justoDEPS="dialog sqlite3 openssh-client".Me gusta la respuesta de Daniel Andersson, pero no funcionó para mí. Estoy en Ubuntu 12.04.
Desde la página de manual de dpkg ,
db:Status-abbrevsolo funciona en dpkg 1.16.2+:Mi solución fue usar el comportamiento heredado, solo el
Statusformateador:salidas
Supongo que esto fue la inspiración para "ii" en otras representaciones.
Entonces, para adaptar completamente la respuesta de Daniel Andersson para trabajar en una versión anterior de dpkg y, por lo tanto, distribuciones de Ubuntu más antiguas:
Devoluciones:
fuente