`apt-get`和通配符:glob与regex

乔纳森(Jonathan Y.)

编辑:请注意,如下所述,我知道此站点上的答案,解释了apt-get使用正则表达式解释程序包名称的原因。实际上,问题直接在于其实际行为与所记录的行为不同的方式。在建议重复之前,请先阅读问题。


该网站上的一些答案警告您使用apt-get通配符(例如,星号:)*,因为apt-get据称它们会将它们扩展为正则表达式,这可能会带来意想不到的(和不期望的)结果,尤其是使用apt-get remove确实,Ubuntuman页面上的apt-get内容如下:

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

实际上,此答案声称:

apt-get接受一个正则表达式而不是glob模式作为外壳。

我认为这是错误的(至少从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页面,或者此行为记录不当?

muru

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月之间的提交),并且该更改已在changelog中提及

因此,这可能是在四年前添加的,但仅在2015才有记录并且apt-get的联机帮助仍然被忽略。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章