首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >apt全升级与apt获取域升级

apt全升级与apt获取域升级
EN

Ask Ubuntu用户
提问于 2016-05-10 08:01:21
回答 6查看 169.5K关注 0票数 119

根据手册页:

  • apt有参数full-upgrade
  • apt-get具有参数dist-upgrade

这两个命令是一样的吗?

顺便说一句:在Ubuntu16.04?apt还是apt-get中哪个是官方推荐的命令?

EN

回答 6

Ask Ubuntu用户

发布于 2016-05-10 08:11:42

apt full-upgrade执行与apt-get dist-upgrade相同的功能。

man apt

完全升级(apt(8))执行升级功能,但如果需要升级整个系统,则将删除当前安装的软件包。

man apt-get

除了执行升级功能外,还可以智能地处理与新版本包的依赖关系;apt-get有一个“智能”冲突解决系统,如果需要,它将尝试升级最重要的包,而牺牲不太重要的包。因此,dist-升级命令可能会删除一些包。列表文件包含要从其中检索所需包文件的位置列表。还请参阅apt_preferences(5),以获得用于覆盖单个包的常规设置的机制。

票数 72
EN

Ask Ubuntu用户

发布于 2021-02-14 18:31:10

是的,他们是同一个命令。apt的cmdline/apt.cc的这一部分证明了这一点:

代码语言:javascript
复制
static std::vector<aptDispatchWithHelp> GetCommands()            /*{{{*/
{
   return {
      // [snip]
    
      // system wide stuff
      {"update", &DoUpdate, _("update list of available packages")},
      {"upgrade", &DoUpgrade, _("upgrade the system by installing/upgrading packages")},
      {"full-upgrade", &DoDistUpgrade, _("upgrade the system by removing/installing/upgrading packages")},
    
      // misc
      {"edit-sources", &EditSources, _("edit the source information file")},
      {"moo", &DoMoo, nullptr},
    
      // for compat with muscle memory
      {"dist-upgrade", &DoDistUpgrade, nullptr},
    
      // [snip]
   };
}

为了完整起见,cmdline/apt-get.cc

代码语言:javascript
复制
static std::vector<aptDispatchWithHelp> GetCommands()           /*{{{*/
{
   return {
      // [snip]
      {"dist-upgrade", &DoDistUpgrade, _("Distribution upgrade, see apt-get(8)")},
      {"full-upgrade", &DoDistUpgrade, nullptr},
      // [snip]
   };
}

对于aptapt-getfull-upgradedist-upgrade都引用相同的DoDistUpgrade函数,因此执行相同的操作,但apt在这里有不同的默认选项:

在apt(8)成功安装软件包后,相应的.deb包文件将从/var/ cache /apt/ files缓存目录中删除

APT::Keep-Downloaded-Packages可以控制apt-get的这种行为。

奖金调查

@Lii提出了一个很好的观点,即DoDistUpgrade可以根据所使用的二进制文件(即argv[0])采取不同的行动。代码比我预期的要简单得多,因为需要考虑许多层和全局变量,但让我们看看。

ParseCommandLine函数用于两个二进制文件。该函数在命令行可能产生影响的地方执行以下步骤:

  1. InitLocale(Binary):所有情况下相同的代码。
  2. pkgInitConfig(**Cnf):所有情况都使用extern Configuration *_config全局变量。
  3. BinarySpecificConfiguration(argv[0]):现在这很有趣。apt有一些与apt-get:不同的有意义的默认选项
    1. APT::Get::Upgrade-Allow-New = true。默认情况下,这是启用--with-new-pkgsapt-get的选项。这在apt的S手册中有记录,但是这里的影响只是对upgrade命令的影响。
    2. APT::Keep-Downloaded-Packages = false。这是aptapt-get之间的一个实际区别,并在新闻档案中解释:

安装后自动移除借方在apt(8)成功安装包后,相应的.deb包文件将从/var/ cache /apt/ files缓存目录中删除。...请注意apt的行为没有变化.下载的借记卡在安装后将保存在缓存目录中。

  1. BinaryCommandSpecificConfiguration(argv[0], CmdCalled)两个二进制文件对所有这些命令都执行相同的操作:"upgrade", "dist-upgrade", "full-upgrade"
  2. _config->MoveSubTree(conf.c_str(), nullptr)根据所使用的二进制文件应用以Binary::apt::aptBinary::apt::apt-get为前缀的选项。

忽略了其他不相关的步骤。

然后,DispatchCommandLine函数将调用DoDistUpgrade处理程序。

在调用堆栈的后面,DoCacheManipulationFromCommandLine()681中有一个有趣的部分:

代码语言:javascript
复制
     bool const distUpgradeMode = strcmp(CmdL.FileList[0], "dist-upgrade") == 0 || strcmp(CmdL.FileList[0], "full-upgrade") == 0;

     bool resolver_fail = false;
     if (distUpgradeMode == true || UpgradeMode != APT::Upgrade::ALLOW_EVERYTHING)
        resolver_fail = APT::Upgrade::Upgrade(Cache, UpgradeMode, &Progress);

在这里,使用任意一个命令的两个二进制文件执行相同的步骤。

也许我漏掉了什么,但那就是我要阻止这次调查的地方。

票数 60
EN

Ask Ubuntu用户

发布于 2019-07-22 16:48:02

使用apt作为首选,但是如果您正在编写脚本,则使用apt-get。Apt-get具有更稳定的输出(意味着输出格式尽可能地保持不受干扰,从而不会破坏自动解析该输出的脚本)。Apt-get也有一些在apt中不可用的低级命令。

apt和apt-get的手册页面描述了完全升级和dist-升级,但它们可能是相同的命令(apt接受dist升级作为完全升级的别名)。这是apt稳定的一个很好的例子。在apt中,名称被更改为更便于用户使用,而apt的名称则保持不变,以避免破坏与旧脚本的兼容性。

票数 6
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/770135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档