Instale dependências com o apt-get sem torná-las independentes se já instaladas

4

Quando eu uso o apt-get para instalar acidentalmente um pacote que já está instalado como uma dependência de outro pacote, ele quebra essa "dependência" marcando o pacote como manual em vez de auto .

Posso corrigi-lo manualmente mais tarde usando sudo apt-mark markauto package-name .

Existe uma maneira de dizer ao apt-get (ou aptitude, dpkg ou outra ferramenta) para não quebrar o link em primeiro lugar ou para não fazer nada se o pacote requisitado já estiver instalado?

Eu me deparo com isso de várias maneiras diferentes:

Eu tenho uma lista de pacotes para instalar para fazer algo específico funcionar (a partir de instruções em um site como este).

Eu tenho uma lista de todos os pacotes que adicionei a uma instalação e copio para que todos sejam adicionados a outra instalação - por exemplo, quando eu faço uma instalação limpa ao invés de uma atualização do meu sistema.

    
por Joe 30.08.2016 / 06:04

2 respostas

2

Você disse

  

Quando eu uso o apt-get para instalar acidentalmente um pacote que já está instalado como uma dependência de outro pacote, ele quebra essa "dependência" marcando o pacote como manual em vez de auto

Eu acho que você entendeu um pouco errado. Não vai quebrar a cadeia de dependência. O outro pacote ainda depende deste pacote marcado como manual . A única coisa afetada é que, se você executar agora apt-get autoremove , os pacotes marcados como manuais não serão removidos. Porque, para apt marcado como manual significa que o usuário instalou-os deliberadamente, não porque o usuário queria outros pacotes que dependessem desses pacotes.

Você perguntou

  

Existe uma maneira de dizer ao apt-get (ou aptitude, dpkg ou outra ferramenta) para não quebrar o link em primeiro lugar ou para não fazer nada se o pacote requisitado já estiver instalado?

Eu não encontrei nenhuma ferramenta para fazer isso automaticamente até agora. Mas isso também não parece lógico. Porque, nesse caso, será como todos os pacotes que você está instalando serão automatically installed , tornando-os vulneráveis ao comando apt-get autoremove .

Portanto, se você quiser que algum pacote seja marcado como instalado automaticamente apesar de ter sido instalado manualmente, use apt-get markauto ou aptitude mark-auto .

    
por Anwar 30.08.2016 / 16:47
0

Se não há como fazer isso com uma ferramenta existente, veja uma solução alternativa.

Execute cada pacote através de um script bash como o seguinte:

#!/bin/bash
dpkg -s "" &> /dev/null
(($?)) && sudo apt-get install ""

dpkg -s retorna 0 se o pacote (fornecido como argumento para o script) estiver instalado; 1 se não for. Este script não fará nada se o pacote estiver instalado, mas instale-o se não estiver - evitando o problema original.

O comando dpkg gera um monte de informações que não são necessárias aqui, portanto, ele é redirecionado para o depósito /dev/null bit para se livrar dele.

(($?)) analisa o código de retorno de dpkg . Funciona como C - oposto de testes normais de bash. Se $? for 1 porque o pacote não está instalado, isso será avaliado como true e acionará a cláusula && para instalar o pacote.

Dependendo do que é necessário, isso pode ser feito em uma função e / ou colocado em um loop sobre uma lista de nomes de pacotes.

Se isso fosse muito usado, o código também seria adicionado para verificar se o argumento não era nulo e não continha espaços em branco incorporados ou outro lixo. Mas tudo isso é apenas um script normal e não faz parte da solução em si.

Eu encontrei a técnica dpkg aqui .

    
por Joe 31.08.2016 / 04:47