问题描述
我认为运行apt-get autoremove
不使用任何以下参数会删除系统上所有未使用的依赖项,而运行apt-get autoremove xxx
则会删除xxx及其未使用的依赖项。
但是我发现不是。运行apt-get autoremove xxx
不仅会删除xxx及其未使用的依赖关系,还会删除所有其他未使用的依赖关系。
然后,我尝试运行apt-get remove --auto-remove xxx
,认为这只会删除xxx及其未使用的依赖项。令我惊讶的是,它还删除了xxx,其未使用的依赖性以及所有其他未使用的依赖性。
这使我想到两个相关的问题。
(1)这是命令的预期行为吗?
(2)是否有一种简单的方法可以删除xxx及其未使用的依赖关系,而又不删除其他未使用的依赖关系?
(似乎aptitude remove
的行为也类似。)
最佳回答
从源压缩文件中http://packages.ubuntu.com/source/maverick/apt的文件cmdline/apt-get.cc
中查看,我可以看到--auto-remove
是启用APT::Get::AutomaticRemove
设置的参数。
命令autoremove
和remove
都调用函数DoInstall
。
命令”autoremove”也会设置APT::Get::AutomaticRemove
,因此它与--auto-remove
的作用相同。
查看DoAutomaticRemove
函数,可以清楚地看到启用APT::Get::AutomaticRemove
设置(--auto-remove
和autoremove
会执行此操作)会导致Apt循环遍历所有已安装的软件包,并将未使用的软件包标记为删除。
从main()
:
CommandLine::Args Args[] = {
// ... stripped to save space
{0,"auto-remove","APT::Get::AutomaticRemove",0},
// ...
}
CommandLine::Dispatch Cmds[] = { // ...
{"remove",&DoInstall},
{"purge",&DoInstall},
{"autoremove",&DoInstall},
// ...
}
// ...
// Parse the command line and initialize the package library
CommandLine CmdL(Args,_config);
从DoInstall()
:
unsigned short fallback = MOD_INSTALL;
if (strcasecmp(CmdL.FileList[0],"remove") == 0)
fallback = MOD_REMOVE;
else if (strcasecmp(CmdL.FileList[0], "purge") == 0)
{
_config->Set("APT::Get::Purge", true);
fallback = MOD_REMOVE;
}
else if (strcasecmp(CmdL.FileList[0], "autoremove") == 0)
{
_config->Set("APT::Get::AutomaticRemove", "true");
fallback = MOD_REMOVE;
}
从功能DoAutomaticRemove
:
bool doAutoRemove = _config->FindB("APT::Get::AutomaticRemove", false);
// ...
// look over the cache to see what can be removed
for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); ! Pkg.end(); ++Pkg) {
if (doAutoRemove) {
if(Pkg.CurrentVer() != 0 &&
Pkg->CurrentState != pkgCache::State::ConfigFiles)
Cache->MarkDelete(Pkg, purgePkgs);
else
Cache->MarkKeep(Pkg, false, false);
}
}
我不能说这是不是故意的,您可以填写a bug /向launchpad.net询问a question。
目前,无法排除apt-get autoremove
删除软件包。如果要保留软件包,请运行apt-get -s autoremove
,从列表中复制软件包,然后从要保留的列表中删除软件包。最后,删除这些软件包:sudo apt-get purge [packages-to-be-removed]
(清除也会删除配置文件,如果有的话)