적성검색? 좁다 vs.? 그리고

적성검색? 좁다 vs.? 그리고

적성검색 ?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))'

발견된 패키지는설치됨그리고 백포트가 있어요쓸 수 있는, 그러나 백포트가 반드시 설치될 필요는 없습니다. (백포트가 설치되어 있을 수도 있고 그렇지 않을 수도 있습니다.)

반면에 두 번째 명령은

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

발견된 패키지는설치됨,게다가현재 설치된 버전백포트, 즉 실제 설치의 백포트에서. 이는 더 제한적인 검색이므로설치됨백포팅은 다음의 하위 집합입니다.쓸 수 있는백포트. 다음과 같이 생각할 수 있습니다.

  • 모든 패키지

    • 설치된 패키지

      • 사용 가능한 백포트가 있는 설치된 패키지(첫 번째 명령)

        • 설치된 백포트(두 번째 명령)

시스템에서 첫 번째 명령은 결과를 반환하지만 두 번째 명령은 아무것도 반환하지 않습니다. 이는 사용 가능한 백포트가 있는 패키지를 설치했지만 해당 백포트가 현재 설치되지 않았음을 의미합니다.

긴 대답

이는 능력치의 차이와 관련이 있습니다.그리고 일치패키지 버전. ~에서 문서:

패키지에 대해 패턴을 일치시키는 것과 해당 패키지의 모든 버전에 대해 패턴을 일치시키는 것 사이에는 미묘하지만 중요한 차이가 있습니다. 패턴이 패키지와 일치하면 각 용어가 패키지와 일치하므로 각 용어는 다음과 같은 경우에 일치합니다.어느패키지 버전이 일치합니다. 반대로 패턴이 패키지의 모든 버전과 일치하는 경우 패턴의 모든 용어가 패키지 버전과 일치하면 패턴이 성공적으로 일치합니다.동일한패키지 버전.

예: 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)

관련 정보