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 via um script de shell.
Código de exemplo abaixo:
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
Tudo meio que funciona, mas a lógica parece falha porque não é a instalação confiável dos 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 $2'} | grep --regexp=^$pkg$ != """ ]; then
E mesmo com os sinalizadores -n
e -z
para verificar se a sequência retornada estava vazia. Tenho certeza de que estou perdendo algum bom senso aqui.
Você tem alguma idéia do que eu poderia fazer para garantir que um pacote esteja realmente instalado ou não?
Obrigado!
apt-get install
pacotes instalados também? Você poderia simplesmente ligarapt-get install $MISC $WEB
.Respostas:
Essencialmente, você só precisa substituir a
if
condição porNão é possível usar
dpkg-query
, porque retorna true também para pacotes removidos, mas não eliminados.Sugiro também verificar o código de saída
apt-get
antes de enviar a mensagem de sucesso:fonte
&>
faz?/dev/null
neste caso), porque não precisamos da saída, apenas o código de saída. Ele só funcionabash
(a primeira linha do script deve ser#!/bin/bash
) caso contrário, use>/dev/null 2>&1
.Você pode testá-lo através do dpkg-query:
Observe que * e? são curingas, se aparecerem em $ pkg. Eu acho que o dpkg-query pode imprimir "reinst-required installed" em vez de "ok installed", se o pacote estiver quebrado e precisar ser reinstalado pelo comando
apt-get install --reinstall
que pode ser usado para instalar novos pacotes também.fonte
fonte