¿Existe alguna diferencia entre descargar/instalar una lista de paquetes y descargar cada paquete por separado?

¿Existe alguna diferencia entre descargar/instalar una lista de paquetes y descargar cada paquete por separado?

Dada una lista de paquetes de desarrollo (por ejemplo, pkgs="python3.5-dev python3-tk"), ¿habría alguna diferencia entre ejecutar

sudo apt-get install $pkgs 

vs.

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

estoy preguntando principalmentedependencias-topo-sortrelacionado, es decir, habrá diferentes paquetes descargados e instalados de cualquier manera

Respuesta1

Sí, se pueden seleccionar diferentes paquetes para satisfacer las dependencias.Ejecutando 1 comando que especificanorteLos paquetes que se instalarán a veces tendrán un efecto diferente al de ejecutarnortecomandos, cada uno de los cuales especifica 1 paquete a instalar, incluso cuando los paquetes reales especificados son los mismos en cada caso.

El principalprácticola diferencia es probablemente la únicakarel ha descrito.Sin embargo, los efectos pueden diferir incluso cuando todas las operaciones se realizan correctamente, debido a la diferente resolución de dependencia.

La razón es la que usted supuso en términos generales:

estoy preguntando principalmentedependencias-topo-sortrelacionado

Más específicamente, esto sucede porque puede haber más de una alternativa que satisfaga una dependencia.

Explicación abstracta

Supongamos que desea instalar el paquetea, que depende de unpaquete virtual v, yvse puede satisfacer por paquetebo paquetecy de ninguna otra manera. Suponerbno depende dec,cno depende deby ninguno de esos paquetes ya está instalado. Ahora supongamos que ejecutas:

sudo apt-get install a

Entonces APT seleccionarábocpara satisfacer la dependencia. Cuál elige es el resultado de un cálculo que realiza y que puede verse afectado por los paquetes que ha instalado, los paquetes disponibles, la versión de APT que está utilizando y cómo está configurado. Pero cuando todas estas condiciones son iguales, la decisión será la misma cada vez.

Suponersin pérdida de generalidadque escogeb. Entoncesaybestán instalados. Supongamos que luego ejecuta:

sudo apt-get install c

Después,a,b, ycestán todos instalados. Es decir, los tres paquetes se instalaron como resultado de ejecutar:

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

A diferencia de, supongamos que tuviera que ejecutar este comando en lugar de aquellos:

sudo apt-get install a c

Entonces, desdeala dependencia devestá satisfecho conc,bno está instalado. Es decir, sóloayc, pero nob, se instalan como consecuencia de la ejecución de:

sudo apt-get install a c

Ejemplo concreto

Puede encontrar ejemplos concretos de esto ejecutando apto apt-getcon la -sopción, lo que hace que simule su acción en lugar de realizarla. (Solo recuerda que no puedes confirmarlos completamente solo con apt-get -s/ apt -s, porque los comandos apt-get -s/ anteriores apt -sno afectan a los posteriores, ya que no afectan a nada, ya que son solo simulaciones).

Ejecutarlo sudo apt-get install jediten mi sistema Ubuntu 16.04 LTS instalaría varios paquetes 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])

Si le dijera a APT que instalara ambos jedity openjdk-9-jreejecutando sudo apt-get install jedit openjdk-9-jre, entonces no instalaría los paquetes OpenJDK 8, porque jeditlos paquetes OpenJDK 9 satisfacen la dependencia de un tiempo de ejecución de Java:

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])

Si instalé jedity openjdk-9-jrecon dos sudo apt-get installcomandos separados, emitidos en ese orden, obtendría los paquetes OpenJDK 8 y OpenJDK 9.

Respuesta2

Si no se puede instalar ni siquiera un paquete de una lista muy larga de paquetes, la ejecución del comando se detendrá e imprimirá un mensaje de error informativo. También puede resultar frustrante instalar una larga lista de paquetes en un lote porque algunos de los paquetes requerirán la entrada interactiva del usuario en la terminal para poder instalarse correctamente. Si comete un error en la entrada del usuario, deberá reiniciar todo el proceso de instalación desde el principio.

Es difícil lograr que el comando se ejecute exitosamente hasta el final a menos que divida la larga lista inicial de paquetes en grupos de 25 a 40 paquetes y luego instale los paquetes con apt un grupo a la vez. Esto no requiere mucho tiempo extra y hace que la instalación de todos los paquetes sea más fácil de administrar.

Sólo recuerda una cosa más. sudo apt installbloquea el directorio administrativo ( /var/lib/dpkg/) cuando se está ejecutando, así que no ejecute ningún otro proceso que requiera privilegios de root hasta que apt finalice completamente el procesamiento. Por ejemplo, si está instalando paquetes con apt desde la terminal, no intente instalar otros paquetes snap desde la terminal en una nueva pestaña o ventana hasta que apt termine de procesarse.

información relacionada