Jon*_* Y. 7 package-management apt
编辑:请注意,如下所述,我知道此站点上的答案解释apt-get
使用正则表达式来解释包的名称。事实上,问题直接在于它的实际行为与记录的行为不同的方式。请在建议重复之前阅读问题。
该站点上的一些答案警告不要使用apt-get
通配符(即星号: *
),因为apt-get
据说将它们扩展为正则表达式,这可能会产生意外(和不希望的)结果,尤其是apt-get remove
. 事实上,Ubuntuman
页面apt-get
读取:
如果没有包与给定的表达式匹配并且表达式包含“.”、“?”之一 或 '*' 那么它被假定为一个 POSIX 正则表达式,它被应用于数据库中的所有包名称。然后安装(或删除)任何匹配项。请注意,匹配是由子字符串完成的,因此 'lo.*' 匹配 'how-lo' 和 'lowest'。如果这是不希望的,请使用 '^' 或 '$' 字符锚定正则表达式,或者创建更具体的正则表达式。
事实上,这个答案声称:
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*'
[...]
Run Code Online (Sandbox Code Playgroud)
(我没有删除任何匹配项,只删除了apt-get
响应中不相关的部分。)
在我看来,基于这种行为,apt-get
首先尝试将给定的表达式匹配为 globs,只有当它失败时,它才会作为正则表达式重试。
我有这个权利吗?我是否误解了该man
页面,或者这种行为是否有不良记录?
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.
Run Code Online (Sandbox Code Playgroud)
此段落在15.10 联机帮助页中不存在,因此可能已在 16.04 中添加。
apt 的变更日志中似乎没有提及这一点 - 2013 年添加此内容的提交并未在联机帮助页中显示任何更改。此功能被短暂禁用并随后重新启用(请参阅2014 年 5 月至 2 月之间的提交),并且更改日志中提到了禁用。
因此,这可能是四年前添加的,但直到 2015 年才记录。Andapt-get
的联机帮助页仍然被忽略。
归档时间: |
|
查看次数: |
4799 次 |
最近记录: |