Tengo un requisito simple Quiero definir varias variables que corresponderán a cualquier número de paquetes dados que quiero instalar a través de un script de shell.
Código de muestra a continuación:
MISC="shutter pidgin"
WEB="apache2 mongodb"
for pkg in $MISC $WEB; do
if [ "dpkg-query -W $pkg | awk {'print $1'} = """ ]; then
echo -e "$pkg is already installed"
else
apt-get -qq install $pkg
echo "Successfully installed $pkg"
fi
done
Todo funciona, pero la lógica parece defectuosa porque no está instalando de manera confiable los paquetes que quiero. Dice que ya se han instalado o está intentando instalar paquetes que ya se han instalado anteriormente.
También he estado intentando command -vo lo siguiente:
if [ "dpkg -l | awk {'print $2'} | grep --regexp=^$pkg$ != """ ]; then
E incluso con las banderas -ny -zpara verificar si la cadena devuelta estaba vacía. Estoy bastante seguro de que me falta algo de sentido común aquí.
¿Tienes alguna idea de lo que podría hacer para asegurarme de que un paquete esté realmente instalado o no?
¡Gracias!

apt-get installpaquetes instalados? Podrías simplemente llamarapt-get install $MISC $WEB.Respuestas:
Esencialmente solo necesita reemplazar la
ifcondición conNo es posible usarlo
dpkg-query, porque devuelve verdadero también para los paquetes eliminados pero no purgados.También sugiero verificar el código de salida de
apt-getantes de dar el mensaje exitoso:fuente
&>hacer?/dev/nullen este caso), porque no necesitamos la salida, solo el código de salida. Solo funciona enbash(la primera línea del guión tiene que ser#!/bin/bash) de lo contrario usar>/dev/null 2>&1.Puede probarlo con dpkg-query:
Tenga en cuenta que * y? son comodines, si aparecen en $ pkg. Supongo que dpkg-query puede imprimir "reinst-required instalado" en lugar de "ok instalado", si el paquete está roto y necesita ser reinstalado por un comando
apt-get install --reinstallque también se puede utilizar para instalar nuevos paquetes.fuente
fuente