Aptitude

aptitude search ?narrow vs ?and

  • April 14, 2019

aptitude search的?narrow和options 有什麼區別??and例如,為什麼會aptitude search "?and(?installed,?origin(backports))"在我的系統上返回結果,但aptitude search "?narrow(?installed,?origin(backports))"什麼也不返回?

請注意,在版本apt-cache policy返回的包上執行?and表明安裝的版本不是來自 backports,因此?narrow結果是正確的。但是我遇到過類似的不直覺的結果,之前已經通過使用?narrowGoogle搜尋解決了,但一直不明白為什麼。

簡短的回答

第一個命令

aptitude search '?and(?installed,?origin(backports))'

查找已安裝且具有 backport 的,但不一定已安裝 backport。(也許已經安裝了 backport,也許沒有。)

相比之下,第二個命令

aptitude search '?narrow(?installed,?origin(backports))'

查找已安裝的包,目前安裝的版本來自一個反向移植,即實際安裝的反向移植。這是一個更具限制性的搜尋,因為已安裝的反向埠集是可用反向埠的子集。你可以這樣想:

  • 所有套餐

    • 已安裝的軟體包

      • 已安裝的具有可用反向埠的軟體包(第一個命令)

        • 安裝的反向埠(第二個命令)

在您的系統上,第一個命令返回結果,但第二個命令不返回任何結果。這意味著您已經安裝了具有可用反向埠的軟體包,但顯然目前沒有安裝這些反向埠。

長答案

它與 aptitude 在匹配包和匹配包版本之間的區別有關。從 文件中:

將模式與包匹配和將其與該包的所有版本匹配之間存在微妙但重要的區別。當一個模式與一個包匹配時,它的每個術語都與包匹配,因此如果包的任何版本匹配,每個術語都將匹配。相反,當一個模式與一個包的每個版本匹配時,如果它的所有術語都與包的同一版本匹配,它將成功匹配。

例如:假設安裝了該版本3.0-1的軟體包aardvark,但該版本4.0-1可用。然後搜尋表達式?version(4\.0-1)?installed匹配 aardvark,因為 ?version(4\.0-1)匹配 aardvark 的版本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))'

獲取已安裝的所有軟體包版本的列表,然後是 具有與正則表達式匹配的來源的所有軟體包版本backports的列表,然後返回出現在兩個列表中的軟體包。

另一方面,文件?narrow

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

選擇單個版本同時匹配過濾器和模式的包。

所以這就是為什麼這個查詢只顯示單個安裝版本的來源匹配的包backports

aptitude search '?narrow(?installed, ?origin(backports))'

該函式有一個相關的討論?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))'

哇!如果您發現查詢語言aptitude令人困惑(就像我一樣),您可能更喜歡使用不同的方法,例如 Python綁定到libapt. 您可以直接檢查原始字元串,而不是匹配版本字元串,如下所示:

import apt

apt_cache = apt.Cache()

for pkg in apt_cache:
   if pkg.is_installed:
       for pkg_origin in pkg.installed.origins:
           if pkg_origin.origin == 'Debian Backports':
               print(pkg.name)

引用自:https://unix.stackexchange.com/questions/301765