Могу ли я увидеть, почему установлен пакет?

112

Для конкретного пакета, могу ли я узнать, почему он установлен?

Итак, я могу видеть, или это установлено вручную, или что это установлено как зависимость другого пакета? Или что он установлен как часть дистрибутива?

Питер Смит
источник
Это связано с (частью) этого вопроса, подробности смотрите в этом ответе .
Кошик
Гораздо лучше ответить на 2017 год здесь: askubuntu.com/questions/128524/…
Ламбарт

Ответы:

107

Быстрое решение состоит в том, чтобы ввести следующую команду в терминале:

aptitude why $package

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

aptitude why $package --show-summary

Замените $ package на имя пакета, и вам может понадобиться aptitudeсначала установить пакет.

Вот результат, который вы можете получить aptitude why aspell --show-summary

Packages requiring aspell:
  inkscape

Для более подробной информации вы бы запустить aptitude why aspell. Вы можете прочитать пример вывода ниже: «Вы установили вручную inkscape, что требует libgtkspell, что требует libenchantic2a, что требует aspell». ( iмаркеры указывают на установленные пакеты; Aмаркеры указывают на автоматически установленные пакеты.)

i   inkscape       Depends libgtkspell0 (>= 2.0.10)                                                                    
i A libgtkspell0   Depends libenchant1c2a (>= 1.6.0)                                                                   
i A libenchant1c2a Depends aspell-en | myspell-dictionary | aspell-dictionary | ispell-dictionary | hunspell-dictionary
i A aspell-en      Depends aspell (>= 0.60.3-2)

Наконец, следующая команда

apt-cache rdepends --installed $package

перечисляет другие пакеты, установленные на вашем компьютере, которые напрямую зависят от $ package . Вы можете добавить --recurseопцию для перечисления всех пакетов, которые прямо или косвенно зависят от него.

enzotib
источник
Способность жалости не включена по умолчанию :(
badp
1
@ Badp спасибо, чтобы указать. Это плохо с Maverick, только чтобы сэкономить место на ISO-образе livecd. Но это бесценный инструмент, и я не останусь без него.
энзотиб
15
apt-cache rdepends --recurse $packageвероятно дает слишком много пакетов. Я бы добавил --installedопцию, ограничивающую установленные пакеты. -iопция ограничивает до-зависимость и пакеты, связанные с зависимостью. Но пакет может быть установлен, потому что он рекомендован другим пакетом. Чтобы включить такие связанные с рекомендациями пакеты, я полагаю, что это даст правильные:apt-cache rdepends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --installed --recurse $package
Ярно
4
немного более короткий эквивалент заклинания @ jarno, при условии, что вы используете bash или другую оболочку с расширением скобки:apt-cache rdepends --no-{suggests,conflicts,breaks,replaces,enhances} --installed --recurse $package
akavel
30

Быстрое и краткое объяснение того, почему определенный пакет был установлен, можно узнать, набрав следующую команду в терминале ( Applications -> Accessories -> Terminal):

aptitude why <package-name>

Замените на имя интересующего вас пакета. Например, введите aptitude why libgoo-canvas-perl:

i   shutter Suggests libgoo-canvas-perl

Это в основном означает, что пакет shutterв этом случае предложил libgoo-canvas-perlустановить. Затем, набрав, aptitude why shutterя могу пройтись по цепочке зависимостей.

Однако есть одна оговорка. Я часто замечаю, что aptitude находит наиболее правдоподобное объяснение ситуации, которая, возможно, не соответствует действительности, но тем не менее даст вам ключ к дальнейшему рассмотрению.

В моем случае, shutterпредполагает libgoo-canvas-perl- однако, предлагаемые пакеты не устанавливаются автоматически по умолчанию. Тем не менее, это пробуждает мою память об «опыте» с невозможностью редактировать скриншоты, с помощью shutterкоторых я вручную установилligbgoo-canvas-perl

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

aptitude show <package-name>

Это выведет строку, как показано ниже (3-я строка вывода):

Automatically installed: no

Для получения дополнительной информации запустите info aptitude(в терминале) или посетите вики-страницу Aptitude.

Чтобы узнать, когда был установлен конкретный пакет, есть 2 варианта:

  1. Менеджер пакетов Synaptic ведет журнал истории всех действий. Чтобы просмотреть файл журнала истории, выберите «История» в меню «Файл». Вы можете Installвыполнить поиск (обратите внимание на случай), чтобы получить список всех записей, касающихся установки. Тем не менее, это покажет только пакеты, установленные с помощью Synaptic
  2. Выполните следующую команду в терминале. Это будет искать в журналах dpkg записи истории установки. Однако существует максимальный предел количества этих журналов, поэтому, если искомый пакет был установлен давно, вы можете его не найти. Подробнее здесь

    zcat -f /var/log/dpkg.log* | grep "\ install\ " | grep -i <package-name>
    
Koushik
источник
1
Если вы хотите узнать, когда пакет был установлен или обновленzcat -f /var/log/dpkg.log* | grep -i PackageName | egrep “\ install\ |\ upgrade\ “
Chris Good
@ChrisGood: можете ли вы повторно ввести свой комментарий без умных кавычек, чтобы его можно было копировать / вставлять?
Дан Даскалеску
1
Спасибо что подметил это. С правильными двойными кавычками: zcat -f /var/log/dpkg.log* | grep -i PackageName | egrep "\ install \ | \ upgrade \"
Крис Гуд
12

Да, вы можете, и это довольно очевидная команда, на самом деле. Предполагая, что вы установили aptitude, вы можете открыть тип объявления в окне терминала:

aptitude why package

Это должно дать список пакетов, которые зависят от этого конкретного пакета. Если это пакет, установленный вручную, он скажет что-то вроде «Не удалось найти причину для установки пакета».

Даниэль Родригес
источник
5

Вот простой способ, который не зависит aptitude, который 10.10 больше не поставляется по умолчанию.

Графически

Откройте Synaptic и попробуйте удалить его.

Если появляется диалоговое окно с просьбой удалить другие пакеты, это пакеты, которые (рекурсивно) зависят от него.

От терминала

apt-get remove package_name_goes_here -s

Опять же, пакеты, которые будут удалены в результате, - это все те, которые (рекурсивно) зависят от него. ( -sПараметр говорит apt-getне удалять пакет)

badp
источник
2
Это рискованное решение, поскольку оно может фактически удалить пакет и все зависимости, если они ошибочно нажмут.
ImaginaryRobots
1
@ImaginaryRobots, это много ошибок. (В первом диалоговом окне нужно нажать «ОК», затем «Применить», затем снова «ОК» в диалоговом окне подтверждения.) Для версии терминала также существует дополнительный y/Nзапрос подтверждения, если вы опечатаете -s. Я добавил предупреждение, однако.
Badp
1
-1, поскольку эта информация доступна в Synaptic на вкладке зависимостей при просмотре свойств пакета.
alexanderpas
@alex неверен - этот диалог не сообщает вам, установлен ли этот пакет вручную или автоматически. PS: Сброс счетчика входящих, попробуйте больше.
badp
@badp нет, но эту информацию можно найти с помощью фильтра состояния «Установлено (вручную)» на главном экране, и ее можно увидеть в меню пакета при выборе пакета.
alexanderpas