那么 aptitude 的 ?origin() 搜索词到底与什么匹配?

那么 aptitude 的 ?origin() 搜索词到底与什么匹配?

因为它似乎与%O显示格式转义生成的字符串不同,也与 的 URL 不同sources.list.d

就我而言,我正在寻找从非 Ubuntu 源安装的软件包,我遇到的麻烦可以在此示例中看到:

$ aptitude search --display-format '%v %p %O#' '?exact-name(syncthing)'
1.23.6         syncthing                            Syncthing:syncthing [amd64]         
$ aptitude search --display-format '%v %p %O#' '?exact-name(syncthing) !?origin(ubuntu)'
$ aptitude search --display-format '%v %p %O#' '?exact-name(syncthing) ?origin(ubuntu)'
1.23.6         syncthing                            Syncthing:syncthing [amd64]         
$ 

?origin根本不包含该术语时,SyncThing 会显示不包含“ubuntu”的来源,因此我预计在添加时它会保留!?origin(ubuntu)(即“不能来自与模式‘ubuntu’匹配的来源”)。相反,它会消失,除非我更改该术语以要求它来自与“ubuntu”匹配的来源!

查看来源列表也没有什么启发:

$ cat /etc/apt/sources.list.d/syncthing.list
deb [signed-by=/etc/apt/keyrings/syncthing-release-key.gpg] https://apt.syncthing.net/ syncthing stable

这显然不是“所有来源都匹配‘ubuntu’”的情况,但是,如果我查看 VS Code 而不是 SyncThing,它的行为符合预期:

$ aptitude search --display-format '%v %p %O#' '?exact-name(code)'
1.81.0-1690980 code                                 code stable:stable [amd64]          
$ aptitude search --display-format '%v %p %O#' '?exact-name(code) !?origin(ubuntu)'
1.81.0-1690980 code                                 code stable:stable [amd64]          
$ aptitude search --display-format '%v %p %O#' '?exact-name(code) ?origin(ubuntu)'
$                                                            

那么搜索词实际上如何?origin表现?它匹配什么?

答案1

搜索aptitude词与存储库文件中的值?origin匹配。OriginRelease

例如,在 22.04 的一个非常基本的安装中,输出apt-cache policy列出了以下存储库。在此输出中,搜索词?origino=值进行比较,该值Ubuntu适用于此计算机上的所有存储库。

root@ubuntu:~# apt-cache policy
Package files:
 100 /var/lib/dpkg/status
     release a=now
 500 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages
     release v=22.04,o=Ubuntu,a=jammy-security,n=jammy,l=Ubuntu,c=restricted,b=amd64
     origin security.ubuntu.com
 500 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages
     release v=22.04,o=Ubuntu,a=jammy-security,n=jammy,l=Ubuntu,c=main,b=amd64
     origin security.ubuntu.com
 500 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages
     release v=22.04,o=Ubuntu,a=jammy-updates,n=jammy,l=Ubuntu,c=restricted,b=amd64
     origin archive.ubuntu.com
 500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
     release v=22.04,o=Ubuntu,a=jammy-updates,n=jammy,l=Ubuntu,c=main,b=amd64
     origin archive.ubuntu.com
 500 http://archive.ubuntu.com/ubuntu jammy/restricted amd64 Packages
     release v=22.04,o=Ubuntu,a=jammy,n=jammy,l=Ubuntu,c=restricted,b=amd64
     origin archive.ubuntu.com
 500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
     release v=22.04,o=Ubuntu,a=jammy,n=jammy,l=Ubuntu,c=main,b=amd64
     origin archive.ubuntu.com

浏览存储库的 Release 文件会显示相应的值。例如http://us.archive.ubuntu.com/ubuntu/dists/jammy/Release包含

Origin: Ubuntu
Label: Ubuntu
Suite: jammy
Version: 22.04
Codename: jammy

你可以使用以下命令aptitude搜索可用的软件包Origin

aptitude search "?origin(Ubuntu)"

您可以搜索“我从非 Ubuntu 源安装的软件包”。?origin(.*)可以添加搜索词以避免可能没有任何 的软件包出现问题origin

aptitude search "?and(?installed, ?not(?origin(Ubuntu)))"
or
aptitude search "?and(?installed, ?origin(.*), ?not(?origin(Ubuntu)))"

Ubuntu作为一个更复杂的例子,我最喜欢的命令之一是从官方存储库(包括)中查找所有可用更新的软件包UbuntuESM

aptitude search "?and(?upgradable, ?narrow(?version(CANDIDATE), ?origin(^Ubuntu~(ESM~){0,1}$)))"

起源名称特别令人困惑,因为

  • 正如原始问题所述,搜索词与?origin显示格式值不匹配。%O
  • apt_preferences允许您指定一个origin,但与origin存储库主机名匹配。例如archive.ubuntu.com
  • unattended-upgradesAllowed-Origins具有真正的存储库值组合的配置。

同步

如果我添加syncthing存储库,那么syncthing包将同时存在UbuntuSyncthing来源。

输出apt-cache policy显示有关存储库的以下信息。

 500 https://apt.syncthing.net syncthing/stable amd64 Packages
     release o=Syncthing,a=syncthing,n=debian,l=Syncthing,c=stable,b=amd64
     origin apt.syncthing.net

输出apt-cache policy syncthing显示了 Syncthing 和 Ubuntu 存储库中可用的包。

root@ubuntu:~# apt-cache policy syncthing
syncthing:
  Installed: (none)
  Candidate: 1.23.6
  Version table:
     1.23.6 500
        500 https://apt.syncthing.net syncthing/stable amd64 Packages
     1.23.5 500
        500 https://apt.syncthing.net syncthing/stable amd64 Packages
     1.18.0~ds1-3ubuntu0.2 500
        500 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages
        500 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages
     1.18.0~ds1-3 500
        500 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages

类似的 aptitude 搜索?and(?origin(Ubuntu), ?exact-name(syncthing))将会匹配,syncthing因为有一个与该软件包匹配的版本。

我尝试过的一些测试

root@ubuntu:~# aptitude search "?and(?origin(Ubuntu), ?exact-name(syncthing))" -F "%p,%m#,%O#" | column -t
syncthing,Syncthing  Release  Management  <[email protected]>,Syncthing:syncthing  [amd64]

root@ubuntu:~# aptitude search "?any-version(?and(?origin(Ubuntu), ?exact-name(syncthing)))" -F "%p,%m#,%O#" | column -t
syncthing,Syncthing  Release  Management  <[email protected]>,Syncthing:syncthing  [amd64]

root@ubuntu:~# aptitude search "?all-versions(?and(?origin(Ubuntu), ?exact-name(syncthing)))" -F "%p,%m#,%O#" | column -t

您可以尝试使用搜索词来?narrow限制软件包的特定版本。这应该会显示已安装的软件包,其中安装版本的来源不是Ubuntu

aptitude search "?narrow(?version(CURRENT),?and(?origin(.*),?not(?origin(^Ubuntu))))"

笔记

我希望有一个可以参考的来源。这只是我过去通过测试得出的信息。

相关内容