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
, ev
pode ser satisfeito por pacoteb
ou pacotec
e de nenhuma outra maneira. Suponhab
não depende dec
,c
nã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áb
ouc
para 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ãoa
eb
estão instalados. Suponha que você execute:
sudo apt-get install c
Depois disso,a
,b
, ec
estã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, desdea
dependência dev
está satisfeito porc
,b
não está instalado. Ou seja, apenasa
ec
, 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 apt
ou apt-get
com a -s
opçã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 -s
não afetam os posteriores, pois não afetam nada, pois são apenas simulações.)
A execução sudo apt-get install jedit
no 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 jedit
e openjdk-9-jre
executando sudo apt-get install jedit openjdk-9-jre
, então ele não instalaria pacotes OpenJDK 8, porque jedit
a 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 jedit
e openjdk-9-jre
com dois sudo apt-get install
comandos 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 install
bloqueia 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.