给定一个开发包列表(例如 pkgs="python3.5-dev python3-tk"),运行之间会有区别吗
sudo apt-get install $pkgs
对比
for p in $pkgs; do sudo apt-get install $p; done
我问的主要是依赖项-拓扑排序相关,即是否会以任何一种方式下载和安装不同的包
给定一个开发包列表(例如 pkgs="python3.5-dev python3-tk"),运行之间会有区别吗
sudo apt-get install $pkgs
对比
for p in $pkgs; do sudo apt-get install $p; done
我问的主要是依赖项-拓扑排序相关,即是否会以任何一种方式下载和安装不同的包
是的,可以选择不同的包来满足依赖关系。运行 1 个命令指定要安装的N个包有时会与运行N个命令产生不同的效果,每个命令指定要安装 1 个包,即使在每种情况下指定的实际包都相同。
主要的实际区别可能是karel 所描述的。但是,即使所有操作都成功,由于依赖关系解析不同,效果也会有所不同。
原因正如您广泛推测的那样:
更具体地说,发生这种情况是因为可能有不止一种替代方案可以满足依赖关系。
抽象解释
假设你想安装 package
a
,它依赖于一个虚拟的 packagev
,并且v
可以通过 packageb
或 package来满足c
,没有其他方式。假设b
不依赖c
,c
不依赖b
,并且这些包都没有安装。现在假设您运行:然后APT会选择
b
或c
满足依赖。它选择哪一个是它执行的计算的结果,这可能会受到您安装的软件包、可用的软件包、您使用的 APT 版本以及它的配置方式的影响。但是当所有这些条件都相同时,每次都会做出相同的决定。不失一般性假设它选择了
b
。然后a
并b
安装。假设您然后运行:之后,
a
,b
, 和c
都安装好了。也就是说,所有三个软件包都是由于运行而安装的:相反,假设您要运行此命令而不是那些:
然后,由于
a
对 的依赖v
满足c
,b
未安装。也就是说,只有a
和c
,而不是b
,作为运行的结果被安装:具体例子
apt
您可以通过运行或apt-get
使用选项找到具体示例-s
,这会导致它模拟您的操作而不是执行它。(请记住,您不能仅使用apt-get -s
/完全确认它们apt -s
,因为早期的apt-get -s
/apt -s
命令不会影响后面的命令,因为它们不会影响任何东西,因为它们只是模拟。)在我的 Ubuntu 16.04 LTS 系统上运行
sudo apt-get install jedit
会安装几个 OpenJDK 8 包:如果我告诉 APT 安装
jedit
和openjdk-9-jre
运行sudo apt-get install jedit openjdk-9-jre
,那么它不会安装 OpenJDK 8 包,因为jedit
OpenJDK 9 包满足了对 Java 运行时的依赖:如果我安装
jedit
并openjdk-9-jre
使用两个单独sudo apt-get install
的命令,按该顺序发出,那么我将同时获得 OpenJDK 8 和 OpenJDK 9 包。如果无法安装很长的软件包列表中的一个软件包,则该命令的执行将停止并打印一条信息性错误消息。批量安装一长串软件包也可能令人沮丧,因为某些软件包需要在终端中进行交互式用户输入才能成功安装。如果您在用户输入中出错,那么您将不得不从头开始重新启动整个安装过程。
除非您将最初的一长串软件包分成 25-40 个软件包的组,然后一次安装一组软件包,否则很难让命令成功执行到最后。这不会花费太多额外的时间,并且使安装所有软件包更容易管理。
只记得一件事。
sudo apt install
在运行时锁定管理目录 (/var/lib/dpkg/
),因此在 apt 完全完成处理之前不要运行任何其他需要 root 权限的进程。例如,如果您使用 apt 从终端安装软件包,在 apt 完成处理之前,不要尝试从终端在新选项卡或窗口中安装其他 snap 软件包。