问题描述
这些命令有什么区别?
-
sudo apt-get autoremove --purge packagenames
-
sudo apt-get remove --purge packagenames
-
sudo apt-get purge purge packagenmaes
-
sudo apt-get remove packagenames
-
sudo apt-get autoremove
最佳方法
快速回答
-
remove
卸载以其命名的软件包。 -
autoremove
卸载所有不再需要的自动安装的软件包。在autoremove
之后列出包名称是不正确的;它们将被忽略(并且所有符合条件的软件包都将被删除),这可能不是您想要的。 -
--purge
会导致与被删除的包关联的系统范围配置文件也被删除。它必须附带命令,例如remove
或autoremove
。--purge
标志修改命令的操作;它不会自行行动。 -
purge
与--purge remove
含义相同(与remove --purge
相同)。说两次purge
是不正确的;第二个purge
被解释为包的名称为purge
d,这可能不是您想要的。
完整答案
要了解这些命令的作用以及它们有何不同,理解两个概念会有所帮助(甚至可能是必要的):
-
手动安装包和自动安装包的区别
-
包的包文件和配置文件之间的区别
手动安装与自动安装
已安装的软件包可以手动或自动安装。
当您指定要安装的包并安装它时,它是手动安装的。
但也可以安装其他软件包。大多数包都具有依赖关系——必须安装其他包才能使这些包按预期工作。当您安装一个软件包时,它的依赖项(即它所依赖的其他软件包)也会被安装,除了之前安装的软件包。
当您未指定要安装的软件包,而是作为您指定安装的软件包的依赖项安装时,系统会自动安装该软件包。
请注意,当您安装了两个软件包并且其中一个软件包是另一个软件包的依赖项时,这并不意味着该依赖项会自动安装。依赖项也可能是手动安装的(即由您指定,例如在依赖它的包之前或同时安装)。
最后:
-
如果您尝试手动安装已安装的软件包,它仍保持安装状态。但如果它是自动安装的,则会发生更改 – 尝试手动安装它会将其标记为手动安装。
-
您可以将任何软件包标记为手动或自动安装(使用
apt-mark
命令),无论它们实际安装的方式或情况如何。 -
Ubuntu 系统预装的软件包并非全部自动安装;其中一些标记为自动安装,另一些标记为手动安装。这是为了满足区分手动和自动安装的软件包背后的逻辑——某些软件包仅在为其他软件包服务时才需要。
通常,对于每个自动安装的软件包,您将至少有一个依赖于它的手动安装的软件包(并导致它被自动安装)。但是,如果您随后删除依赖于自动安装的软件包的所有手动安装的软件包,则将不再需要自动安装的软件包,但仍会安装。
apt-get autoremove
删除自动安装的软件包,这些软件包不再有任何手动安装的软件包依赖于它们。
包文件和配置文件
软件包提供的文件在安装该软件包版本的每个系统上都应保持相同。此类文件为已安装的程序提供可执行文件、资源、文档和其他 “assets”。我们通常只是称这些包提供的”the files”。
但包也提供了其他文件,这些文件可能会被更改。这些称为全局(或系统范围)配置文件。它们几乎总是安装在 /etc
目录中,并且可以自动和手动修改它们以更改已安装程序的行为。例如, sudo
有一个配置文件 /etc/sudoers
,以及一个用于存放更多配置文件的目录 /etc/sudoers.d
。该文件以及添加到该目录的任何文件指定允许谁以何种方式使用 sudo
。
通常,卸载软件包然后重新安装它不应改变其行为方式(当然,除非其软件包文件已损坏,这就是您重新安装它的原因)。因此,通常在卸载软件包时,其软件包文件将被删除,但其系统范围的配置文件将保持不变。
当您卸载某个包而未指定其系统范围配置文件也应被删除时,该包称为 “removing”。
如果您还想在卸载软件包时删除该软件包的系统范围配置文件,则该软件包称为 “purging”。
apt-get remove
将删除一个包;也就是说,它将卸载该软件包,但保留其系统范围的配置文件。
apt-get purge
将清除包;也就是说,它将卸载该软件包并确保删除其系统范围的配置文件。
清除包的另一种方法是使用 --purge
标志。这并没有告诉 apt-get
要做什么;而是告诉 apt-get
要做什么。相反,它会修改 remove
等术语(或 “commands”)告诉它要做的事情。 --purge
标志导致任何软件包卸载都伴随着删除正在卸载的软件包的系统范围配置文件。换句话说,--purge
标志将删除转变为清除。
为什么当我们有 purge
命令时我们有 --purge
标志?毕竟, sudo apt-get --purge remove packagename
不等于 sudo apt-get purge packagename
吗?它们是等价的。当您想要修改 remove
以外的命令的行为时, --purge
会派上用场。
例如,假设您想要卸载不再需要的自动安装的软件包(因为不再有任何手动安装的软件包依赖于它们),但是您不仅仅想删除这些自动安装的软件包,您还想删除他们的系统范围的配置文件。然后你可以运行:
sudo apt-get --purge autoremove
让我们考虑 --purge
的另一种用法。有一个名为 --reinstall
的标志,它将安装转换为重新安装。这就是说,通常,当您尝试安装已经安装的软件包时,要么什么也不会发生,要么(如果该软件包被标记为自动安装)该软件包将被标记为手动安装。但是使用 --reinstall
标志,安装已安装的软件包会导致其被删除然后重新安装:
sudo apt-get --reinstall install packagename
但是假设您想要删除正在重新安装的软件包的系统范围配置文件。这有点常见;当某个软件包无法工作并且您不知道原因时,您可以尝试重新安装它,并删除其配置文件,以便将其配置重置为默认值。要实现此目的,您可以运行:
sudo apt-get --purge --reinstall install packagename
--reinstall
将安装转变为重新安装(即先删除后安装),--purge
将重新安装的删除部分转变为清除。
你的例子的行为
现在应该清楚每个示例 apt-get
命令的作用:
-
sudo apt-get autoremove --purge packagenames
\n这将清除自动安装的软件包,这些软件包不再有任何依赖于它们的手动安装的软件包。也就是说,它会卸载这些包(这需要删除它们的包文件),并且也会删除它们的系统范围配置文件。\n这里,packagenames
不执行任何操作。特别是,如果您打算仅删除其中列出名称的包,那么这将不会按照您的预期运行。\n -
sudo apt-get remove --purge packagenames
\n这将清除packagenames
;假设packagenames
是 whitespace-separated 包名称列表,它将清除所有包名称。也就是说,它将卸载它们(这需要删除它们的软件包文件),并且还将删除它们的系统范围配置文件。\n如果未安装packagenames
中列出的任何软件包,则其在列表中的存在将不起作用(除非您将被告知它尚未安装)。如果列出的包名称不是任何实际包的名称,该命令将失败并出现unable to locate packagename
错误。\n -
sudo apt-get purge purge packagenmaes
\n如果您删除了该命令中出现的purge
的其中一个,则它将与前一个等效。目前,它尝试清除名为purge
的包,并清除packagenames
中列出的包。由于purge
不是任何包的名称,因此它将失败并显示错误消息。\n -
sudo apt-get remove packagenames
\n这将删除packagenames
中列出的包,这需要删除它们的包文件。这不会删除其系统范围的配置文件(因为这只是删除,而不是清除)。\n -
sudo apt-get autoremove
\n这将卸载自动安装的软件包,这些软件包不再有任何依赖于它们的手动安装的软件包。这需要删除它们的包文件,而不是它们的系统范围配置文件(也就是说,这是删除而不是清除)。\n
有关如何使用 apt-get
的更多信息,我推荐 its manual page 。有关更多一般信息,请参阅 this guide 。