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 0
en el script de shell) si el paquete está instalado, falso (estado de salida 1
) de lo contrario.
-W
significa "Mostrar" ( dpkg-query
debe 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/null
silencia dpkg-query
si 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 ^.i
suele ser suficiente (y más fácil de recordar).dpkg-query -l
salida 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 policy
comando.fuente
grep
parte 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?grep
desempeñado en el comando, ¿así que lo eliminaste y ahora dices que no funciona?grep -q
da el código de retorno1
si no coincide, es decir, el programa no está instalado o no está disponible, o0
si 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-abbrev
solo funciona en dpkg 1.16.2+:Mi solución fue usar el comportamiento heredado, solo el
Status
formateador: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