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 -v
o lo siguiente:
if [ "dpkg -l | awk {'print $2'} | grep --regexp=^$pkg$ != """ ]; then
E incluso con las banderas -n
y -z
para 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 install
paquetes instalados? Podrías simplemente llamarapt-get install $MISC $WEB
.Respuestas:
Esencialmente solo necesita reemplazar la
if
condició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-get
antes de dar el mensaje exitoso:fuente
&>
hacer?/dev/null
en 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 --reinstall
que también se puede utilizar para instalar nuevos paquetes.fuente
fuente