这些命令有什么区别?
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
答案1
快速回答
remove
卸载以其命名的软件包。autoremove
卸载所有不再需要的自动安装的软件包。在 之后列出软件包名称是错误的autoremove
;它们将被忽略(并且全部符合条件的套餐将被删除),这可能不是您想要的。--purge
导致与要删除的软件包相关的系统范围的配置文件也被删除。它必须与命令一起使用,例如remove
或autoremove
。该--purge
标志修改命令的操作;它不能单独起作用。purge
含义与 相同--purge remove
(与 相同remove --purge
)。说purge
两次是错误的;第二次purge
被解释为要安装的包的名称purge
,这可能不是您想要的。
完整答案
为了理解这些命令的作用以及它们有何不同,理解两个概念会有所帮助(甚至可能是必不可少的):
- 之间的区别手动安装和自动安装包
- 包之间的区别包文件和它的配置文件
手动安装与自动安装
已安装的软件包可以是手动或者自动地已安装。
当你指定要安装的包并且它被安装时,它手动已安装。
但也可能安装其他软件包。大多数软件包都有依赖项——必须安装其他软件包,这些软件包才能正常工作。安装软件包时,除了之前安装的软件包外,还会安装其依赖项(即它所依赖的其他软件包)。
当您没有指定要安装的软件包,而是将其作为您指定要安装的软件包的依赖项进行安装时,该软件包自动地已安装。
请注意,当您安装了两个软件包,其中一个软件包是另一个软件包的依赖项时,这并不意味着依赖项会自动安装。依赖项也可能是手动安装的(即由您指定,例如,在依赖它的软件包之前或同时安装)。
最后:
- 如果您尝试手动安装已安装的软件包,它将保持安装状态。但如果它是自动安装的,则会发生变化 - 尝试手动安装它将被标记为手动安装。
- 您可以将任何包标记为手动或自动安装(使用
apt-mark
安装指南使用以下命令安装它们: - Ubuntu 系统预装的软件包并非全部自动安装;其中一些被标记为自动安装,而另一些被标记为手动安装。这是为了满足区分手动和自动安装软件包背后的逻辑——某些软件包仅在为其他软件包服务时才需要。
通常,对于每个自动安装的包,您至少会有一个依赖于它的手动安装包(并导致它自动安装)。但是,如果您删除所有依赖于自动安装包的手动安装包,则自动安装的包将不再需要,但仍会安装。
apt-get autoremove
删除自动安装的、不再依赖于任何手动安装的软件包的软件包。
包文件和配置文件
软件包提供的文件旨在在安装该软件包版本的每个系统上保持一致。此类文件为已安装程序提供可执行文件、资源、文档和其他“资产”。我们通常将这些称为软件包提供的“文件”。
但是软件包还提供了其他文件,这些文件(可能)会被更改。这些文件被称为全局(或系统范围)配置文件。它们几乎总是安装在目录中/etc
,并且可以自动或手动修改以更改已安装程序的行为。例如,sudo
有一个配置文件/etc/sudoers
,以及一个用于存放更多配置文件的目录/etc/sudoers.d
。该文件以及添加到该目录的任何文件指定谁可以sudo
以何种方式使用。
通常,卸载软件包然后重新安装时,最好不要改变其行为方式(除非其包文件已损坏,因此您当然要重新安装它)。因此,通常在卸载软件包时,其软件包文件会被删除,但其系统范围的配置文件将保持不变。
当您卸载软件包而没有指定也应该删除其系统范围的配置文件时,这称为“删除”该软件包。
如果您在卸载软件包时还想删除软件包的系统范围配置文件,这就称为“清除”软件包。
apt-get remove
将删除一个软件包;也就是说,它将卸载该软件包但保留其系统范围的配置文件。
apt-get purge
将清除一个包;也就是说,它将卸载该包并确保删除其系统范围的配置文件。
清除软件包的另一种方法是使用--purge
标志。它不告诉apt-get
要做什么;相反,它修改了remove
指示它做什么的术语(或“命令”)。该--purge
标志会导致任何软件包卸载都伴随着被卸载软件包的系统范围配置文件的删除。换句话说,该--purge
标志将删除变成清除。
--purge
为什么我们有命令时会有标志purge
?毕竟,不sudo apt-get --purge remove packagename
等同于sudo apt-get purge packagename
。它们是等效的。--purge
当你想修改命令的行为时,它就派上用场了其他比remove
。
例如,假设您想要卸载不再需要的自动安装的软件包(因为不再有任何手动安装的软件包依赖于它们),但您不仅想删除这些自动安装的软件包,还想删除它们的系统范围配置文件。那么您可以运行:
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
这将清除自动安装的软件包,这些软件包不再依赖任何手动安装的软件包。也就是说,它将卸载这些软件包(这需要删除它们的软件包文件),并删除它们的系统范围配置文件。
这里,
packagenames
什么也不做。特别是,如果您只想删除名称列在此处的软件包,那么这将不会按您的意图运行。sudo apt-get remove --purge packagenames
这将清除
packagenames
;假设packagenames
是一个空格分隔的软件包名称列表,它将清除所有软件包。也就是说,它将卸载它们(这需要删除它们的软件包文件),并且还将删除它们的系统范围配置文件。如果列出的任何软件包
packagenames
未安装,则列表中的软件包将不起作用(除非您会被告知它未安装)。如果您列出的软件包名称不是任何实际软件包的名称,则命令将失败并出现错误。unable to locate packagename
sudo apt-get purge purge packagenmaes
如果您删除该命令中的一个
purge
,它将等同于前一个。目前,它会尝试清除名为 的包purge
,并清除 中列出的包packagenames
。由于purge
不是任何包的名称,它将失败并显示错误消息。sudo apt-get remove packagenames
这将删除 中列出的软件包
packagenames
,从而删除其软件包文件。这不会删除其系统范围的配置文件(因为这只是删除,而不是清除)。sudo apt-get autoremove
这将卸载不再依赖任何手动安装的软件包的自动安装软件包。这需要删除它们的软件包文件,但不是它们的系统范围的配置文件(也就是说,这是删除而不是清除)。