能力倾向搜索?狭窄与?和

pav*_*von 5 aptitude

?narrowaptitude 搜索的和选项有什么区别?and?例如,为什么aptitude search "?and(?installed,?origin(backports))"我的系统会返回结果,但aptitude search "?narrow(?installed,?origin(backports))"什么也不返回?

请注意,apt-cache policy在版本返回的包上运行?and表明安装的版本不是来自向后移植的,因此?narrow结果是正确的。但我之前遇到过类似的不直观的结果,?narrow在一些谷歌搜索后已通过使用解决了这些结果,但从未理解为什么。

Nat*_*ver 5

简短回答

第一个命令

aptitude search '?and(?installed,?origin(backports))'
Run Code Online (Sandbox Code Playgroud)

查找已安装且具有可用向后移植的软件包,但不一定安装向后移植。(也许已安装向后移植,也许没有。)

相比之下,第二个命令

aptitude search '?narrow(?installed,?origin(backports))'
Run Code Online (Sandbox Code Playgroud)

查找已安装的软件包,并且当前安装的版本来自向后移植,即实际安装的向后移植。这是一个限制性更强的搜索,因为已安装的向后移植集是可用向后移植的子集。你可以这样想:

  • 所有套餐

    • 已安装的软件包

      • 具有可用向后移植的已安装软件包(第一个命令)

        • 安装的向后移植(第二个命令)

在您的系统上,第一个命令返回结果,但第二个命令不返回任何内容。这意味着您已经安装了具有可用反向移植的软件包,但显然当前没有安装这些反向移植。

长答案

它与 aptitude 匹配包和匹配包版本之间的区别有关。从 文档中:

将模式与包匹配与将模式与该包的所有版本匹配之间存在微妙但重要的区别。当模式与包匹配时,其每个术语都与包匹配,因此如果包的任何版本匹配,则每个术语都将匹配。相反,当模式与包的每个版本匹配时,如果当其所有术语都与包的同一版本匹配时匹配,则该模式将成功匹配。

例如:假设已安装该版本3.0-1的软件包aardvark,但该版本4.0-1可用。然后搜索表达式?version(4\.0-1)?installed与 aardvark 匹配,因为 ?version(4\.0-1)与 aardvark 的 version 匹配4.0-1,而 ?installed与 version 匹配3.0-1。另一方面,此表达式并不与 的所有版本匹配aardvark,因为没有安装任何单个版本并且版本号也为4.0-1

文档内容 如下?and

?and(pattern1, pattern2), pattern1 pattern2

匹配同时匹配pattern1pattern2的包。

请注意,这匹配软件包,而不是单个版本。所以这个查询:

aptitude search '?and(?installed, ?origin(backports))'
Run Code Online (Sandbox Code Playgroud)

获取所有已安装的软件包版本的列表,然后获取 其来源与正则表达式匹配的所有软件包版本backports的列表,然后返回两个列表中出现的软件包

另一方面,文档内容 如下?narrow

?narrow(filter, pattern), ~S filter pattern

选择单个版本同时匹配过滤器和模式的包。

因此,这就是为什么此查询仅显示单个安装版本具有匹配来源的包backports

aptitude search '?narrow(?installed, ?origin(backports))'
Run Code Online (Sandbox Code Playgroud)

该函数有一个相关的讨论?any-version

?any-version(pattern)

如果某个包的任何一个版本与所包含的模式匹配,则匹配该包。

注意:该术语与 密切相关?narrow。事实上, ?any-version(pattern1 pattern2)是完全一样的 ?narrow(pattern1, pattern2)

注意:准确地说,与任何其他模式一样,匹配的不是包,而是包的版本。对于aptitude search和其他用途,它没有太大区别,但aptitude versions只会显示匹配的版本,而不是任何版本匹配的包的所有版本。

通过运行aptitude versions代替aptitude search,我们发现这些查询都给出相同的结果:

aptitude versions '?and(?installed, ?origin(backports))'
aptitude versions '?installed?origin(backports)'
aptitude versions '?narrow(?installed, ?origin(backports))'
Run Code Online (Sandbox Code Playgroud)

哇!如果您发现查询语言令人aptitude困惑(就像我一样),您可能更喜欢使用不同的方法,例如 Pythonlibapt. 您可以直接检查原始字符串,而不是匹配版本字符串,如下所示:

aptitude search '?and(?installed,?origin(backports))'
Run Code Online (Sandbox Code Playgroud)