根据手册页:
apt有参数full-upgradeapt-get具有参数dist-upgrade。这两个命令是一样的吗?
顺便说一句:在Ubuntu16.04?apt还是apt-get中哪个是官方推荐的命令?
发布于 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),以获得用于覆盖单个包的常规设置的机制。
发布于 2021-02-14 18:31:10
是的,他们是同一个命令。apt的cmdline/apt.cc的这一部分证明了这一点:
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:
static std::vector<aptDispatchWithHelp> GetCommands() /*{{{*/
{
return {
// [snip]
{"dist-upgrade", &DoDistUpgrade, _("Distribution upgrade, see apt-get(8)")},
{"full-upgrade", &DoDistUpgrade, nullptr},
// [snip]
};
}对于apt和apt-get,full-upgrade和dist-upgrade都引用相同的DoDistUpgrade函数,因此执行相同的操作,但apt在这里有不同的默认选项:
在apt(8)成功安装软件包后,相应的.deb包文件将从/var/ cache /apt/ files缓存目录中删除
APT::Keep-Downloaded-Packages可以控制apt-get的这种行为。
@Lii提出了一个很好的观点,即DoDistUpgrade可以根据所使用的二进制文件(即argv[0])采取不同的行动。代码比我预期的要简单得多,因为需要考虑许多层和全局变量,但让我们看看。
ParseCommandLine函数用于两个二进制文件。该函数在命令行可能产生影响的地方执行以下步骤:
InitLocale(Binary):所有情况下相同的代码。pkgInitConfig(**Cnf):所有情况都使用extern Configuration *_config全局变量。BinarySpecificConfiguration(argv[0]):现在这很有趣。apt有一些与apt-get:不同的有意义的默认选项APT::Get::Upgrade-Allow-New = true。默认情况下,这是启用--with-new-pkgs到apt-get的选项。这在apt的S手册中有记录,但是这里的影响只是对upgrade命令的影响。APT::Keep-Downloaded-Packages = false。这是apt和apt-get之间的一个实际区别,并在新闻档案中解释:安装后自动移除借方在apt(8)成功安装包后,相应的.deb包文件将从/var/ cache /apt/ files缓存目录中删除。...请注意apt的行为没有变化.下载的借记卡在安装后将保存在缓存目录中。
BinaryCommandSpecificConfiguration(argv[0], CmdCalled)两个二进制文件对所有这些命令都执行相同的操作:"upgrade", "dist-upgrade", "full-upgrade"。_config->MoveSubTree(conf.c_str(), nullptr)根据所使用的二进制文件应用以Binary::apt::apt或Binary::apt::apt-get为前缀的选项。忽略了其他不相关的步骤。
然后,DispatchCommandLine函数将调用DoDistUpgrade处理程序。
在调用堆栈的后面,DoCacheManipulationFromCommandLine()行681中有一个有趣的部分:
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);在这里,使用任意一个命令的两个二进制文件执行相同的步骤。
也许我漏掉了什么,但那就是我要阻止这次调查的地方。
发布于 2019-07-22 16:48:02
使用apt作为首选,但是如果您正在编写脚本,则使用apt-get。Apt-get具有更稳定的输出(意味着输出格式尽可能地保持不受干扰,从而不会破坏自动解析该输出的脚本)。Apt-get也有一些在apt中不可用的低级命令。
apt和apt-get的手册页面描述了完全升级和dist-升级,但它们可能是相同的命令(apt接受dist升级作为完全升级的别名)。这是apt稳定的一个很好的例子。在apt中,名称被更改为更便于用户使用,而apt的名称则保持不变,以避免破坏与旧脚本的兼容性。
https://askubuntu.com/questions/770135
复制相似问题