dpkg-query
como em sua postagem vinculada, parece ser a ferramenta mais correta para o trabalho, exceto o uso, por exemplo, das bibliotecas Python disponíveis para vincular diretamente ao sistema APT em um contexto de script.
Com dpkg-query
:
dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'
Retornará true (status de saída 0
no script shell) se o pacote estiver instalado; false (status de saída 1
) caso contrário.
-W
significa "Mostrar" ( dpkg-query
deve ter uma ação solicitada).
-f
altera o formato da saída.
db:Status-abbrev
é a forma abreviada do status do pacote.
2>/dev/null
silencia dpkg-query
se um nome de pacote inválido for fornecido. Como isso deve ser tratado pode ser um problema caso a caso.
grep -q
retorna true se houver uma correspondência, false caso contrário.
Se for usado com frequência, pode ser feita uma função simples:
#!/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
ou simplesmente
#!/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
geralmente é suficiente (e mais fácil de lembrar).dpkg-query -l
saída não é definida, pois é apenas um modo de apresentação do usuário; portanto, se a apresentação mudar, talvez esse script seja interrompido.dpkg-query -Wf'${Version}' ${pkg} 2>/dev/null | grep -q '^\d*'
para o mesmo efeito.Testei as sugestões de Daniel em três pacotes com estes resultados:
Pacote de repositório Debian nativo não instalado:
Pacote PPA registrado no host e instalado:
Pacote PPA registrado no host, mas não instalado:
Embora eu goste da abordagem, parece que não posso confiar no código de retorno com pacotes PPA. Além disso, acho que vou continuar analisando o retorno do
apt-cache policy
comando.fonte
grep
parte do seu colar. Não consigo realmente reproduzir seu problema, mas isso pode ser porque os exemplos de código estão incompletos no momento, portanto, corrija-o. Você roda o Debian ou o Ubuntu?grep
desempenhado no comando, então você o retirou e agora diz que não funciona?grep -q
fornece código de retorno1
se não corresponder, ou seja, o programa não estiver instalado ou indisponível, ou0
se o programa estiver instalado. Eu expliquei isso no meu post.fonte
DEPS=$(echo {dialog,sqlite3,openssh-client})
pode ser equivalentemente escrito como justoDEPS="dialog sqlite3 openssh-client"
.Gosto da resposta de Daniel Andersson, mas não funcionou para mim. Estou no Ubuntu 12.04.
Na página do manual do dpkg ,
db:Status-abbrev
funciona apenas no dpkg 1.16.2+:Minha solução foi usar o comportamento herdado, apenas o
Status
formatador:saídas
Acho que essa foi a inspiração para "ii" em outras representações.
Portanto, para adaptar completamente a resposta de Daniel Andersson para trabalhar na versão mais antiga do dpkg e, portanto, nas distribuições mais antigas do Ubuntu:
Devoluções:
fonte