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

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

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

Posso corrigir isso 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 ou não fazer nada se o pacote solicitado já estiver instalado?

Eu me deparo com isso de duas 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-a para que todos sejam adicionados a outra instalação - por exemplo, quando faço uma instalação limpa em vez de uma atualização do meu sistema.

Responder1

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 manualem vez deauto

Eu acho que você entendeu um pouco errado. Isso não quebrará a cadeia de dependência. O outro pacote ainda depende dissomarcado como manualpacote. A única coisa afetada é que, se você executar agora apt-get autoremoveestesmarcado como manualos pacotes não serão removidos. Porque, aptmarcado como manual significa que o usuário os instalou deliberadamente, não porque o usuário desejasse outros pacotes que, em troca, 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 ou não fazer nada se o pacote solicitado já estiver instalado?

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 automatically installed, tornando-os vulneráveis ​​ao apt-get autoremovecomando.

Então, se você quiser que algum pacote seja marcado comoinstalado automaticamenteapesar de ser instalado manualmente, você deve usar apt-get markautoou aptitude mark-auto.

Responder2

Se não houver como fazer isso com uma ferramenta existente, aqui está uma solução alternativa.

Execute cada pacote por meio de um script bash como o seguinte:

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

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

O dpkgcomando gera um monte de informações que não são necessárias aqui, então elas são redirecionadas para o /dev/nullbalde de bits para se livrar delas.

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

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

Se isso fosse muito usado, então o código também seria adicionado para verificar se o argumento, $1, não era nulo e não continha espaços em branco incorporados ou outro lixo. Mas tudo isso são apenas scripts normais e não fazem parte da solução em si.

Eu encontrei a dpkgtécnicaaqui.

informação relacionada