`apt-get` 和通配符:通配符 vs. 正则表达式

`apt-get` 和通配符:通配符 vs. 正则表达式

编辑:请注意,正如下文所述,我知道本网站上的答案解释了apt-get使用正则表达式来解释包的名称。事实上,问题直接涉及其实际行为与记录的行为的不同之处。在提出重复建议之前,请先阅读问题。


本网站上的某些答案警告不要使用apt-get通配符(即星号*:),因为apt-get据称会将它们扩展为正则表达式,这可能会产生意外(和不受欢迎的)结果,尤其是使用apt-get remove。事实上,Ubuntuman页面apt-get内容如下:

如果没有包与给定的表达式匹配,并且表达式包含“.”、“?”或“*”之一,则假定它是 POSIX 正则表达式,并将其应用于数据库中的所有包名称。然后安装(或删除)任何匹配项。请注意,匹配是通过子字符串完成的,因此“lo.*”匹配“how-lo”和“lowest”。如果不希望出现这种情况,请使用“^”或“$”字符固定正则表达式,或创建更具体的正则表达式。

实际上,这个答案声明:

apt-get 接受正则表达式而不是 glob 模式作为 shell。

我认为这是错误的(至少对于 Xenial 来说)。例如,我可以重现以下行为:

$ sudo apt-get install -s 'meld*'
[...]
Note, selecting 'meld' for glob 'meld*'
[...]

$ sudo apt-get install -s 'meldt*'
[...]
Note, selecting 'python-meld3' for regex 'meldt*'
Note, selecting 'python3-meld3' for regex 'meldt*'
Note, selecting 'meld' for regex 'meldt*'
[...]

(我没有删除任何匹配项,只是删除了不相关的部分apt-get。)

在我看来,基于这种行为,apt-get首先尝试将给定的表达式匹配为 glob,只有失败时,才会作为正则表达式重试。

我说得对吗?是我误解了man页面内容,还是此行为的记录不全?

答案1

这在apt(8)手册页

install, remove, purge (apt-get(8))
   Performs the requested action on one or more packages specified via
   regex(7), glob(7) or exact match. The requested action can be
   overridden for specific packages by append a plus (+) to the
   package name to install this package or a minus (-) to remove it.

此段不存在15.10 手册页,因此它可能是在 16.04 中添加的。

这似乎没有在 apt 的更新日志中提及 -2013 年添加此内容的提交在手册页中没有显示任何更改。此功能被短暂禁用,后来又重新启用(请参阅2014 年 5 月至 2014 年 2 月期间提交), 和更改日志中提到了禁用

因此这可能是四年前添加的,但是2015 年才有记录. 并且apt-get的手册页仍然被忽视。

相关内容