Posso ver por que um pacote está instalado?

112

Para um pacote específico, posso descobrir por que ele está instalado?

Então, posso ver ou ele é instalado manualmente ou está instalado como uma dependência de outro pacote? Ou que está instalado como parte da distribuição?

Peter Smit
fonte
Isso está relacionado a (uma parte) desta pergunta, consulte esta resposta para obter detalhes.
koushik
Muito melhor resposta para 2017 aqui: askubuntu.com/questions/128524/...
Lambart

Respostas:

107

Uma solução rápida é inserir o seguinte comando em um terminal:

aptitude why $package

ou, se você estiver interessado apenas na causa final:

aptitude why $package --show-summary

Substitua $ package pelo nome do pacote e talvez seja necessário instalar o aptitudepacote primeiro.

Aqui está a saída que você pode obter aptitude why aspell --show-summary

Packages requiring aspell:
  inkscape

Para mais detalhes você executaria aptitude why aspell. Você pode ler o exemplo de saída abaixo: "Você instalou manualmente inkscape, o que requer libgtkspell, o que requer libenchantic2a, o que requer aspell". ( imarcadores indicam pacotes instalados; Amarcadores indicam pacotes instalados automaticamente.)

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)

Finalmente, o seguinte comando

apt-cache rdepends --installed $package

lista os outros pacotes instalados no seu computador que dependem diretamente do $ package . Você pode adicionar a --recurseopção de listar todos os pacotes que dependem direta ou indiretamente dele.

enzotib
fonte
Pity aptitude não está incluído por padrão :(
badp 10/10
1
@badp obrigado a apontar. Esta é a nova novidade do Maverick, apenas para economizar espaço na imagem iso do livecd. Mas é uma ferramenta inestimável, e não ficarei sem.
enzotib 10/10/10
15
apt-cache rdepends --recurse $packageprovavelmente dá muitos pacotes. Eu adicionaria --installedopção para restringir os pacotes instalados. -iA opção restringe-se a pré-dependência e pacotes relacionados à dependência. Mas um pacote pode ser instalado porque é recomendado por outro pacote. Para incluir pacotes relacionados a essa recomendação, suponho que isso daria os corretos:apt-cache rdepends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --installed --recurse $package
jarno 22/12/13
4
equivalente ligeiramente mais curto ao encantamento de @ jarno, supondo que você esteja no bash ou em outro shell com expansão de chave:apt-cache rdepends --no-{suggests,conflicts,breaks,replaces,enhances} --installed --recurse $package
akavel
30

Um rápido e breve raciocínio sobre o motivo de um determinado pacote ter sido instalado pode ser encontrado digitando o seguinte comando em um terminal ( Applications -> Accessories -> Terminal):

aptitude why <package-name>

Substitua pelo nome do pacote em que você está interessado. Por exemplo, digitar aptitude why libgoo-canvas-perlgera o seguinte:

i   shutter Suggests libgoo-canvas-perl

Isso basicamente significa que o pacote shutternesse caso sugeriu a libgoo-canvas-perlinstalação. Ao digitar aptitude why shutter, posso subir a cadeia de dependência.

No entanto, há uma ressalva. Costumo notar que o aptitude encontra a explicação mais plausível para a situação que pode não ser o caso real, mas, no entanto, lhe dará uma pista para procurar mais.

No meu caso, shuttersugere libgoo-canvas-perl- no entanto, pacotes sugeridos não são instalados automaticamente por padrão. No entanto, isso evita minha "experiência" por não poder editar capturas de tela com as shutterquais me levou a instalar manualmenteligbgoo-canvas-perl

Por fim, você pode descobrir se um pacote foi instalado automaticamente (o que significa que o sistema de gerenciamento de pacotes é obrigatório como obrigatório, observando dependências e recomendações de outros pacotes que você pediu para instalar) executando o seguinte comando.

aptitude show <package-name>

Isso produzirá uma linha como abaixo (terceira linha da saída):

Automatically installed: no

Para mais informações, execute info aptitude(em um terminal) ou visite a página wiki do Aptitude

Para descobrir quando um pacote específico foi instalado, existem 2 opções:

  1. O gerenciador de pacotes Synaptic mantém um histórico de todas as atividades. Para visualizar o arquivo de log do histórico, escolha Histórico no menu Arquivo. Você pode procurar Install(lembre-se do caso) para listar todas as entradas relacionadas à instalação. No entanto, isso mostrará apenas os pacotes instalados usando o Synaptic
  2. Execute o seguinte comando em um terminal. Isso procurará nos logs do dpkg por entradas no histórico de instalação. No entanto, há um limite máximo de quanto desses logs são retidos; portanto, se o pacote que você estava procurando foi instalado há muito tempo, talvez você não o encontre. Mais detalhes aqui

    zcat -f /var/log/dpkg.log* | grep "\ install\ " | grep -i <package-name>
    
koushik
fonte
1
Se você quiser saber quando um pacote foi instalado ou atualizadozcat -f /var/log/dpkg.log* | grep -i PackageName | egrep “\ install\ |\ upgrade\ “
Chris Boa
@ ChrisGood: você pode inserir novamente seu comentário sem aspas inteligentes, para que seja copiado / colado?
Dan Dascalescu
1
Obrigado por apontar isso. Com aspas duplas corretas: zcat -f /var/log/dpkg.log* | grep -i PackageName | egrep "\ install \ | \ upgrade \"
Chris Good
12

Sim, você pode, e é um comando bastante óbvio, de fato. Supondo que você tenha o aptitude instalado, você pode abrir um tipo de anúncio da Janela do Terminal:

aptitude why package

Isso deve fornecer uma lista de pacotes que dependem desse pacote específico. Se for um pacote instalado manualmente, será exibido algo como "Não foi possível encontrar um motivo para instalar o pacote".

Daniel Rodrigues
fonte
5

Aqui está uma maneira simples que não depende aptitude, da qual a 10.10 não é mais enviada por padrão.

Graficamente

Abra o Synaptic e tente removê-lo.

Se uma caixa de diálogo aparecer pedindo que você exclua outros pacotes, esses são os pacotes que (recursivamente) dependem dela.

Do terminal

apt-get remove package_name_goes_here -s

Novamente, os pacotes que seriam removidos como resultado são todos aqueles que (recursivamente) dependem dele. (O -sparâmetro diz apt-getpara realmente não remover o pacote.)

badp
fonte
2
Esta é uma solução arriscada, pois ela pode remover o pacote e todas as dependências se elas clicarem incorretamente.
ImaginaryRobots
1
@ImaginaryRobots, isso é muito enganador. (Você deve clicar em Ok na primeira caixa de diálogo, depois em Aplicar, e novamente em Ok na caixa de diálogo de confirmação.) Para a versão do terminal, também há uma y/Nsolicitação de confirmação extra, se você digitar -s. Eu adicionei um aviso no entanto.
badp
1
-1, pois essas informações estão disponíveis no Synaptic, na guia dependências, ao exibir as propriedades de um pacote.
Alexanderpas
@alex incorreto - esse diálogo não informa se esse pacote está instalado manual ou automaticamente. PS: Redefinição do contador da caixa de entrada, tente mais.
badp
@badp no, mas essas informações podem ser encontradas com o filtro de status "Instalado (manual)" na tela principal e podem ser vistas no menu do pacote quando você seleciona um pacote.
Alexanderpas