Verifique com segurança se um pacote está instalado ou não

14

Eu tenho um requisito simples. Eu quero definir várias variáveis que corresponderão a qualquer número de pacotes que eu quero instalar através de um script de shell.

Exemplo de código abaixo:

MISC="shutter pidgin"
WEB="apache2 mongodb"

for pkg in $MISC $WEB; do
    if [ "dpkg-query -W $pkg | awk {'print '} = """ ]; then
        echo -e "$pkg is already installed"
    else
        apt-get -qq install $pkg
        echo "Successfully installed $pkg"
    fi
done

Tudo funciona bem, mas a lógica parece falha porque não está instalando com segurança os pacotes que eu quero. Ele diz que já foi instalado ou está tentando instalar pacotes que já foram instalados anteriormente.

Eu também tenho tentado com command -v ou o seguinte:

if [ "dpkg -l | awk {'print '} | grep --regexp=^$pkg$ != """ ]; then

E mesmo com os sinalizadores -n e -z para verificar se a string retornada estava vazia. Tenho certeza que estou sentindo falta de bom senso aqui.

Você tem alguma idéia do que eu poderia fazer para garantir que um pacote seja realmente instalado ou não?

Obrigado!

    
por vanz 12.07.2013 / 16:43

2 respostas

12

Essencialmente, você só precisa substituir a condição if por

if dpkg --get-selections | grep -q "^$pkg[[:space:]]*install$" >/dev/null; then

Não é possível usar dpkg-query , porque ele retorna true também para pacotes removidos, mas não eliminados.

Sugiro também verificar o código de saída de apt-get antes de fornecer a mensagem de sucesso:

if apt-get -qq install $pkg; then
    echo "Successfully installed $pkg"
else
    echo "Error installing $pkg"
fi
    
por enzotib 12.07.2013 / 17:03
0

Você pode testá-lo pelo dpkg-query:

if dpkg-query -W -f'${Status}' "$pkg" 2>/dev/null | grep -q "ok installed"; then

Observe que * e? são curingas, se aparecerem em $ pkg. Eu acho que o dpkg-query pode imprimir "reinst-required installed" ao invés de "ok installed", se o pacote está quebrado e precisa ser reinstalado pelo comando apt-get install --reinstall , que pode ser usado para instalar novos pacotes também.

    
por jarno 22.04.2015 / 18:46

Tags