Existe alguma diferença entre baixar/instalar uma lista de pacotes e baixar cada pacote sozinho?

Existe alguma diferença entre baixar/instalar uma lista de pacotes e baixar cada pacote sozinho?

Dada uma lista de pacotes de desenvolvimento (por exemplo, pkgs = "python3.5-dev python3-tk"), haveria uma diferença entre executar

sudo apt-get install $pkgs 

vs.

for p in $pkgs; do sudo apt-get install $p; done

Estou perguntando principalmentedependências-topo-sortrelacionado, ou seja, haverá pacotes diferentes baixados e instalados de qualquer maneira

Responder1

Sim, diferentes pacotes podem ser selecionados para satisfazer as dependências.Executando 1 comando que especificaNpacotes a serem instalados às vezes terão um efeito diferente da execuçãoNcomandos, cada um dos quais especifica 1 pacote a ser instalado, mesmo quando os pacotes reais especificados são os mesmos em cada caso.

O principalpráticoa diferença é provavelmente a únicakarel descreveu.No entanto, os efeitos podem ser diferentes mesmo quando todas as operações são bem-sucedidas, devido a diferentes resoluções de dependências.

A razão é como você supôs:

Estou perguntando principalmentedependências-topo-sortrelacionado

Mais especificamente, isso acontece porque pode haver mais de uma alternativa que satisfaça uma dependência.

Explicação Abstrata

Suponha que você queira instalar o pacotea, que depende de umpacote virtual v, evpode ser satisfeito por pacotebou pacotece de nenhuma outra maneira. Suponhabnão depende dec,cnão depende deb, e nenhum desses pacotes já está instalado. Agora suponha que você execute:

sudo apt-get install a

Então o APT selecionaráboucpara satisfazer a dependência. Qual deles ele escolhe é o resultado de um cálculo que ele executa e que pode ser afetado por quais pacotes você instalou, quais pacotes estão disponíveis, qual versão do APT você está usando e como ele está configurado. Mas quando todas essas condições forem iguais, a decisão será tomada sempre da mesma forma.

Suponhasem perda de generalidadeque ele escolhab. Entãoaebestão instalados. Suponha que você execute:

sudo apt-get install c

Depois disso,a,b, ecestão todos instalados. Ou seja, todos os três pacotes foram instalados como resultado da execução:

sudo apt-get install a
sudo apt-get install c

Em contraste, suponha que você execute este comando em vez daqueles:

sudo apt-get install a c

Então, desdeadependência devestá satisfeito porc,bnão está instalado. Ou seja, apenasaec, mas nãob, são instalados como consequência da execução de:

sudo apt-get install a c

Exemplo concreto

Você pode encontrar exemplos concretos disso executando aptou apt-getcom a -sopção, que faz com que ele simule sua ação em vez de executá-la. (Lembre-se de que você não pode confirmá-los totalmente apenas com apt-get -s/ apt -s, porque os comandos apt-get -s/ anteriores apt -snão afetam os posteriores, pois não afetam nada, pois são apenas simulações.)

A execução sudo apt-get install jeditno meu sistema Ubuntu 16.04 LTS instalaria vários pacotes OpenJDK 8:

ek@Io:~$ apt -s install jedit
NOTE: This is only a simulation!
      apt-get needs root privileges for real execution.
      Keep also in mind that locking is deactivated,
      so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  ca-certificates-java default-jre default-jre-headless java-common java-wrappers openjdk-8-jre openjdk-8-jre-headless
Suggested packages:
  default-java-plugin icedtea-8-plugin fonts-wqy-zenhei fonts-indic
The following NEW packages will be installed:
  ca-certificates-java default-jre default-jre-headless java-common java-wrappers jedit openjdk-8-jre
  openjdk-8-jre-headless
0 upgraded, 8 newly installed, 0 to remove and 11 not upgraded.
Inst java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Inst ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all]) []
Inst java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all]) []
Inst openjdk-8-jre-headless (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Inst default-jre-headless (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Inst openjdk-8-jre (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Inst default-jre (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Inst jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])
Conf java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Conf java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all])
Conf ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all])
Conf openjdk-8-jre-headless (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Conf default-jre-headless (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Conf openjdk-8-jre (8u222-b10-1ubuntu1~16.04.1 Ubuntu:16.04/xenial-updates, Ubuntu:16.04/xenial-security [amd64])
Conf default-jre (2:1.8-56ubuntu2 Ubuntu:16.04/xenial [amd64])
Conf jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])

Se eu dissesse ao APT para instalar ambos jedite openjdk-9-jreexecutando sudo apt-get install jedit openjdk-9-jre, então ele não instalaria pacotes OpenJDK 8, porque jedita dependência de um tempo de execução Java é satisfeita pelos pacotes OpenJDK 9:

ek@Io:~$ apt -s install jedit openjdk-9-jre
NOTE: This is only a simulation!
      apt-get needs root privileges for real execution.
      Keep also in mind that locking is deactivated,
      so don't depend on the relevance to the real current situation!
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  ca-certificates-java java-common java-wrappers libatk-wrapper-java libatk-wrapper-java-jni openjdk-9-jre-headless
Suggested packages:
  default-jre icedtea-8-plugin fonts-indic
The following NEW packages will be installed:
  ca-certificates-java java-common java-wrappers jedit libatk-wrapper-java libatk-wrapper-java-jni openjdk-9-jre
  openjdk-9-jre-headless
0 upgraded, 8 newly installed, 0 to remove and 11 not upgraded.
Inst java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Inst ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all]) []
Inst java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all]) []
Inst openjdk-9-jre-headless (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Inst libatk-wrapper-java (0.33.3-6 Ubuntu:16.04/xenial [all])
Inst libatk-wrapper-java-jni (0.33.3-6 Ubuntu:16.04/xenial [amd64])
Inst openjdk-9-jre (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Inst jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])
Conf java-wrappers (0.1.28 Ubuntu:16.04/xenial [all])
Conf java-common (0.56ubuntu2 Ubuntu:16.04/xenial [all])
Conf ca-certificates-java (20160321ubuntu1 Ubuntu:16.04/xenial-updates [all])
Conf openjdk-9-jre-headless (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Conf libatk-wrapper-java (0.33.3-6 Ubuntu:16.04/xenial [all])
Conf libatk-wrapper-java-jni (0.33.3-6 Ubuntu:16.04/xenial [amd64])
Conf openjdk-9-jre (9~b114-0ubuntu1 Ubuntu:16.04/xenial [amd64])
Conf jedit (5.3.0+dfsg-1 Ubuntu:16.04/xenial [all])

Se eu instalasse jedite openjdk-9-jrecom dois sudo apt-get installcomandos separados, emitidos nessa ordem, obteria os pacotes OpenJDK 8 e OpenJDK 9.

Responder2

Se mesmo um pacote de uma lista muito longa de pacotes não puder ser instalado, a execução do comando será interrompida e uma mensagem de erro informativa será impressa. Também pode ser frustrante instalar uma longa lista de pacotes em um lote porque alguns dos pacotes exigirão entrada interativa do usuário no terminal para serem instalados com sucesso. Se você cometer um erro na entrada do usuário, terá que reiniciar todo o processo de instalação desde o início.

É difícil fazer com que o comando seja executado com sucesso até o final, a menos que você divida a longa lista inicial de pacotes em grupos de 25 a 40 pacotes e então instale os pacotes com apt, um grupo de cada vez. Isso não leva muito tempo e facilita o gerenciamento da instalação de todos os pacotes.

Apenas lembre-se de mais uma coisa. sudo apt installbloqueia o diretório administrativo ( /var/lib/dpkg/) quando está em execução, portanto, não execute nenhum outro processo que exija privilégios de root até que o apt termine completamente o processamento. Por exemplo, se você estiver instalando pacotes com o apt a partir do terminal, não tente instalar outros pacotes snap do terminal em uma nova aba ou janela até que o apt termine o processamento.

informação relacionada