적성검색 ?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와 일치합니다. 반면에 이 표현은 단일 버전이 설치되어 있지 않고 버전 번호가 이므로 의 모든 버전과 일치하지 않습니다.aardvark
4.0-1
?version(4\.0-1)?installed
?version(4\.0-1)
4.0-1
?installed
3.0-1
aardvark
4.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))'
우와! (저처럼) 쿼리 언어가 혼란스럽다면 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)