下载/安装软件包列表和单独下载每个软件包之间有什么区别?

下载/安装软件包列表和单独下载每个软件包之间有什么区别?

给定一个开发包列表(例如 pkgs="python3.5-dev python3-tk"),运行

sudo apt-get install $pkgs 

对阵

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

我主要想问依赖项拓扑排序相关,即是否会以任何一种方式下载和安装不同的软件包

答案1

是的,可以选择不同的包来满足依赖关系。运行 1 个指定命令安装的软件包有时会与运行每个命令都指定要安装 1 个包,即使在每个情况下指定的实际包都是相同的。

主要的实际的差异可能就是karel 曾描述过然而,由于依赖关系解析不同,即使所有操作都成功,效果也会有所不同。

原因大致如下:

我主要想问依赖项拓扑排序有关的

更具体地说,发生这种情况是因为可以有多个满足依赖关系的替代方案。

摘要解释

假设您希望安装包a,这取决于虚拟包 v, 和v可以通过套餐满足b或包c别无他法。假设b不依赖于cc不依赖于b,并且这些包都还未安装。现在假设您运行:

sudo apt-get install a

然后 APT 将选择b或者c以满足依赖关系。它选择哪一个是它执行的计算的结果,这可能会受到您安装了哪些软件包、有哪些软件包可用、您使用的 APT 版本以及它的配置方式的影响。但是当所有这些条件都相同时,每次都会做出相同的决定。

认为不失一般性它选择b。 然后ab已安装。假设您运行:

sudo apt-get install c

在那之后,ab, 和c都已安装。也就是说,所有三个包都是通过运行以下命令安装的:

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

相比之下,假设您要运行这个命令而不是那些命令:

sudo apt-get install a c

然后,由于a依赖v满足cb未安装。也就是说,只有ac, 但不是b,是通过运行以下命令安装的:

sudo apt-get install a c

具体例子

apt您可以通过运行或apt-get使用选项来找到具体示例-s,这将使其模拟您的操作而不是执行它。(请记住,您无法仅使用apt-get -s/完全确认它们apt -s,因为较早的apt-get -s/apt -s命令不会影响后续命令,因为它们不会影响任何内容,因为它们只是模拟。)

sudo apt-get install jedit在我的 Ubuntu 16.04 LTS 系统上运行时会安装几个 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])

如果我通过运行告诉 APT 同时安装jedit和,那么它就不会安装 OpenJDK 8 包,因为对 Java 运行时的依赖由 OpenJDK 9 包满足:openjdk-9-jresudo apt-get install jedit openjdk-9-jrejedit

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

如果我按顺序使用两个单独的命令进行jedit安装,那么我将获得 OpenJDK 8 和 OpenJDK 9 包。openjdk-9-jresudo apt-get install

答案2

如果一长串软件包中有一个软件包无法安装,命令的执行就会停止,并打印一条错误消息。一次性安装一长串软件包也是一件令人沮丧的事情,因为有些软件包需要在终端中进行交互式用户输入才能成功安装。如果用户输入有误,则必须从头开始重新启动整个安装过程。

除非您将最初的长包列表分成 25-40 个包的组,然后使用 apt 一次安装一组包,否则很难让命令成功执行到最后。这不会花费太多额外的时间,并且使安装所有包变得更容易管理。

只需记住一件事。运行时sudo apt install会锁定管理目录 ( /var/lib/dpkg/),因此在 apt 完全完成处理之前,不要运行任何其他需要 root 权限的进程。例如,如果您从终端使用 apt 安装软件包,请不要尝试在新选项卡或窗口中从终端安装其他 snap 软件包,直到 apt 完成处理。

相关内容