AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1192939
Accepted
CIsForCookies
CIsForCookies
Asked: 2019-12-02 04:17:56 +0800 CST2019-12-02 04:17:56 +0800 CST 2019-12-02 04:17:56 +0800 CST

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

  • 772

给定一个开发包列表(例如 pkgs="python3.5-dev python3-tk"),运行之间会有区别吗

sudo apt-get install $pkgs 

对比

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

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

package-management dependencies apt
  • 2 2 个回答
  • 1454 Views

2 个回答

  • Voted
  1. Best Answer
    Eliah Kagan
    2019-12-02T05:08:28+08:002019-12-02T05:08:28+08:00

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

    主要的实际区别可能是karel 所描述的。但是,即使所有操作都成功,由于依赖关系解析不同,效果也会有所不同。

    原因正如您广泛推测的那样:

    我问的主要是dependencies-topo-sort相关的

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

    抽象解释

    假设你想安装 package a,它依赖于一个虚拟的 package v,并且v可以通过 packageb或 package来满足c,没有其他方式。假设b不依赖c,c不依赖b,并且这些包都没有安装。现在假设您运行:

    sudo apt-get install a

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

    不失一般性假设它选择了b。然后a并b安装。假设您然后运行:

    sudo apt-get install c

    之后,a,b, 和c都安装好了。也就是说,所有三个软件包都是由于运行而安装的:

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

    相反,假设您要运行此命令而不是那些:

    sudo apt-get install a c

    然后,由于a对 的依赖v满足c,b未安装。也就是说,只有a和c,而不是b,作为运行的结果被安装:

    sudo apt-get install a c

    具体例子

    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 包:

    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-9-jre运行sudo apt-get install jedit openjdk-9-jre,那么它不会安装 OpenJDK 8 包,因为jeditOpenJDK 9 包满足了对 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])
    

    如果我安装jedit并openjdk-9-jre使用两个单独sudo apt-get install的命令,按该顺序发出,那么我将同时获得 OpenJDK 8 和 OpenJDK 9 包。

    • 16
  2. karel
    2019-12-02T04:29:22+08:002019-12-02T04:29:22+08:00

    如果无法安装很长的软件包列表中的一个软件包,则该命令的执行将停止并打印一条信息性错误消息。批量安装一长串软件包也可能令人沮丧,因为某些软件包需要在终端中进行交互式用户输入才能成功安装。如果您在用户输入中出错,那么您将不得不从头开始重新启动整个安装过程。

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

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

    • 8

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行判断机器是否需要重新启动?

  • 有没有办法重置所有包/源并从头开始?

  • 如何回滚到 PHP 5.2?

  • 包管理器之间有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve