Как получить реальное имя пакета и версию для псевдо пакета?

Как получить реальное полное имя пакета (включая версию), которое было бы установлено, если бы я запустил apt-get install pseudo-package-name?

Это связано с предыдущим вопросом: получить версию ядра из пакета lts?

Пример:

apt-get install linux-image-generic-lts-trusty

установил бы (как сейчас на моем 32-битном сервере Trusty):

linux-image-3.13.0-35-generic

Я попробовал следующее, но никто не дал мне ответ. Я пытаюсь написать сценарий так, чтобы я мог просто взять заголовки linux.

$ sudo apt-get install -qqs linux-image-generic-lts-trusty
Inst linux-image-generic-lts-trusty (3.13.0.35.42 Ubuntu:14.04/trusty-updates [i386])
Conf linux-image-generic-lts-trusty (3.13.0.35.42 Ubuntu:14.04/trusty-updates [i386])
$ apt-cache depends linux-image-generic-lts-trusty
linux-image-generic-lts-trusty
  Depends: linux-image-generic
$ apt-cache depends linux-image-generic
linux-image-generic
  Depends: linux-image-3.13.0-35-generic
  Depends: linux-image-extra-3.13.0-35-generic
  Depends: linux-firmware
$ apt-cache policy linux-image-generic-lts-trusty
linux-image-generic-lts-trusty:
  Installed: (none)
  Candidate: 3.13.0.35.42
  Version table:
     3.13.0.35.42 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty-updates/main i386 Packages
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main i386 Packages
     3.13.0.24.28 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main i386 Packages

После некоторого изучения /var/lib/{apt,dpkg} я обнаружил, что нет универсального, пригодного для написания сценария ответа на эту проблему. Итак, аналогично приведенным ниже ответам от @mchid и @muru, я сделал это так:

#!/bin/bash

metapackage=linux-image-generic-lts-trusty
linux_package_version=$(apt-cache policy $metapackage |\
    sed -nE '/Candidate:/ s,[^[:digit:]]*([[:digit:]\.]+)\.([[:digit:]]+)\.[[:digit:]]+,\1-\2,p')

apt-get download linux-headers-${linux_package_version}-generic linux-headers-${linux_package_version})

3 ответа

Решение

Во-первых, вы должны точно указать, какой пакет предоставляет метапакет:

пример:

apt-cache show linux-image-generic-lts-trusty | grep Depends:

выход:

Depends: linux-image-generic
Depends: linux-image-generic

Теперь, если вы введете конкретный пакет метапакета, вы получите точный результат:

apt-cache show linux-image-generic | grep Depends:

выход:

Depends: linux-image-3.13.0-35-generic, linux-image-extra-3.13.0-35-generic, linux-firmware
Depends: linux-image-3.13.0-24-generic, linux-image-extra-3.13.0-24-generic, linux-firmware

Самая новая версия всегда устанавливается, если не указано иное, как в следующем примере:

sudo apt-get install linux-image-3.13.0-24-generic

В качестве альтернативы, если вы просто хотите получить версию, вы можете ввести вместо нее следующую команду или вариант:

apt-cache show linux-image-generic-lts-trusty | grep Version:

выход:

Version: 3.13.0.35.42
Version: 3.13.0.24.28

Проблема в зависимости:

linux-image-generic-lts-trusty
└── linux-image-generic
    └── linux-image-3.13.0-35-generic

Из-за этого вы не можете напрямую получить информацию о том, какой пакет будет установлен. Вам нужно будет использовать что-то вроде apt-rdepends,

В общем, вы не можете. Существуют такие пакеты, как "email-клиент", которые не предоставляют цепочку зависимостей, которую можно отслеживать и разрешать.

Другие вопросы по тегам