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
, yv
se puede satisfacer por paqueteb
o paquetec
y de ninguna otra manera. Suponerb
no depende dec
,c
no depende deb
y ninguno de esos paquetes ya está instalado. Ahora supongamos que ejecutas:
sudo apt-get install a
Entonces APT seleccionaráb
oc
para 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
. Entoncesa
yb
están instalados. Supongamos que luego ejecuta:
sudo apt-get install c
Después,a
,b
, yc
está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, desdea
la dependencia dev
está satisfecho conc
,b
no está instalado. Es decir, sóloa
yc
, 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 apt
o apt-get
con la -s
opció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 -s
no afectan a los posteriores, ya que no afectan a nada, ya que son solo simulaciones).
Ejecutarlo sudo apt-get install jedit
en 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 jedit
y openjdk-9-jre
ejecutando sudo apt-get install jedit openjdk-9-jre
, entonces no instalaría los paquetes OpenJDK 8, porque jedit
los 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é jedit
y openjdk-9-jre
con dos sudo apt-get install
comandos 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 install
bloquea 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.