適性検索?狭い対。そして

適性検索?狭い対。そして

適性検索?narrowとオプションの違いは何ですか??andたとえば、aptitude search "?and(?installed,?origin(backports))"システムが結果を返しますが、aptitude search "?narrow(?installed,?origin(backports))"何も返さないのはなぜですか?

apt-cache policyバージョン別に返されたパッケージで実行すると、インストールされたバージョンが?andバックポートから取得されなかったため、?narrow結果が正しいことを示します。しかし、以前も同様の直感的ではなかった結果に遭遇したことがあり、?narrowインターネット検索を使用して問題を解決しましたが、その理由を理解していませんでした。

答え1

短い答え

最初のコマンド

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

見つかったパッケージインストール済みそしてバックポートがあります。書くことができるただし、バックポートが必ずインストールされる必要はありません。 (バックポートがインストールされている場合とそうでない場合があります。)

一方、2番目のコマンドは

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

見つかったパッケージインストール済み、しかも現在インストールされているバージョンバックポート、つまり実際のインストールのバックポートから。これはより限定的な検索なので、インストール済みバックポーティングは次のサブセットです。書くことができるバックポート。次のように考えることができます。

  • すべてのパッケージ

    • インストール済みパッケージ

      • 利用可能なバックポートを含むインストール済みパッケージ(最初のコマンド)

        • インストールされたバックポート(2番目のコマンド)

システムでは、最初のコマンドは結果を返しますが、2番目のコマンドは何も返しません。これは、利用可能なバックポートを含むパッケージをインストールしましたが、そのバックポートが現在インストールされていないことを意味します。

長い答え

これは能力値の違いに関連しています。パックそしてマッチパッケージバージョン。 ~から 文書:

パッケージのパターンを一致させることと、そのパッケージのすべてのバージョンに対してパターンを一致させることには微妙ですが、重要な違いがあります。パターンがパッケージに一致する場合、各用語はパッケージに一致するため、各用語は次の場合に一致します。どのパッケージのバージョンが一致します。逆に、パターンがパッケージのすべてのバージョンと一致する場合、パターンのすべての用語がパッケージのバージョンと一致すると、パターンは正常に一致します。同じパッケージのバージョン。

例:3.0-1パッケージのバージョンが既にインストールされているが使用できると仮定します。その後、検索式はバージョンに一致する aardvark バージョンと一致するため、aardvark と一致します。一方、この表現は単一バージョンがインストールされておらず、バージョン番号があるため、すべてのバージョンと一致しません。aardvark4.0-1?version(4\.0-1)?installed?version(4\.0-1)4.0-1?installed3.0-1aardvark4.0-1

これ文書 読み取り用?and:

?and(pattern1, pattern2), pattern1 pattern2

両方とも一致するパッケージと一致モード1そしてモード2

一致することを確認してくださいバッグ、いいえシングルバージョン。したがって、このクエリは次のようになります。

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))'

うわー! (私のように)クエリ言語が混乱している場合は、aptitudePythonバインドする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)

関連情報