Como consultar qual pacote RPM fornece uma versão específica

2

Os arquivos RPM SPEC conhecem as versões dos pacotes nas tags Requires: e Provides: , portanto dentro de um arquivo SPEC é fácil criar dependência adequada mesmo com nomes desconfigurados (por exemplo, para evitar conflitos e permitir múltiplas versões de pacotes)

Como exemplo, o pacote foo fornece uma versão atualizada:

Name: foox
Provides: foo = 2

e

Name: bar5
Requires: foo >= 2

funciona muito bem - o yum não instalará o bar5 a menos que o foox também esteja instalado.

Minha pergunta - como posso consultar qual pacote fornece foo = 2 da linha de comando?

Na página man do rpm, parece que

--whatprovides CAPABILITY

Query all packages that provide the CAPABILITY capability. 

--provides

List capabilities this package provides.

Would've sufficed.
I can rpm -q --provides <package name> and see the version.
I can even rpm -q --qf %{VERSION} <package name> and get only the version.
However, I can't rpm -q --whatprovides on the name and version to get the actual package name.

Eu também tentei rpm -q --provides foo , mas eu só recebo o foo original = 1, mesmo que o foox esteja instalado e forneça foo = 2.

o que eu gostaria é da seguinte mágica:

$ rpm -q --whatprovides "foo = 2"
$ foox
    
por Dani_l 10.11.2015 / 12:27

1 resposta

1

Isso é perto:

rpm -q --whatprovides "foo = 2"

mas não aceita uma versão. Para conseguir isso, volte um passo e formate a saída de

rpm -q --whatprovides foo

assim:

rpm -q --queryformat "%{VERSION}:%{NAME}\n" --whatprovides foo

e filtre o resultado por grep (para selecionar seu "2"), e depois por sed, para remover a versão extra seguida por dois-pontos:

grep -E '/^2:/' | sed -e 's/^[^:]*://'

Isso dá apenas o nome do pacote. Na prática, você desejaria a versão, o release e a arquitetura para instalar a dependência correta.

Para referência: 5.2.5. Determinar qual pacote fornece uma certa capacidade (Guia do Fedora RPM)

Em relação ao comentário do OP, o awk seria mais simples:

awk -F: '{ if ($1 == "2") print $2}'

Eu concordo (mas pelo hábito de trabalhar em scripts de configuração, use o segundo do awk para o grep / sed, já que ele é um pouco menos portátil). No entanto, se alguém quisesse verificar pacotes com versões maiores ou iguais a um determinado valor, o awk seria definitivamente muito mais simples, por exemplo,

awk -F: '{ if ($1 >= 2) print $2}'

Isso me ocorreu esta manhã depois que eu já havia saído. Mas esse tipo de comparação é provavelmente mais comum em arquivos de especificações do que em correspondências exatas. Além disso, citar o "2" pode forçar o awk a tratá-lo como uma string em vez de um número. Isso não corresponderia à versão 2.0 , mas deixá-la sem numeração - e numérica - permitiria a correspondência.

@ dave-thompson-085 apontou que encerrando a comparação dentro do ação é desnecessária. Ou seja, a parte dentro de { e } no precedente é uma ação, para todas as linhas (desde que nenhum padrão é fornecido). Citando a página de manual do mawk:

An AWK program is a sequence of pattern {action} pairs and user function definitions.

e depois

   A pattern can be:
          BEGIN
          END
          expression
          expression , expression

Uma expressão pode ser uma expressão regular , mas também pode ser uma comparação . Sua sugestão de melhoria é

awk -F: '$1>=2{print $2}'
    
por 10.11.2015 / 12:45

Tags