특정 버전을 제공하는 RPM 패키지를 확인하는 방법은 무엇입니까?

특정 버전을 제공하는 RPM 패키지를 확인하는 방법은 무엇입니까?

RPM SPEC 파일은 태그의 패키지 버전을 이해하므로 Requires:SPEC Provides:파일 내에서 이름이 혼동되는 경우에도 적절한 종속성을 쉽게 구축할 수 있습니다(예: 충돌을 방지하고 패키지의 여러 버전을 허용하기 위해).

예를 들어 foo 패키지는 업데이트된 버전을 제공합니다.

Name: foox
Provides: foo = 2

그리고

Name: bar5
Requires: foo >= 2

훌륭하게 작동합니다. foox도 설치되지 않으면 yum은 bar5를 설치하지 않습니다.

내 질문 - foo = 2어떤 패키지가 제공되는지 명령줄에서 어떻게 쿼리할 수 있나요?

rpm 매뉴얼 페이지에서 볼 수 있듯이

--어떤 기능이 제공되나요?

Query all packages that provide the CAPABILITY capability. 

--공급

List capabilities this package provides.

충분할 것입니다. 버전을 볼
수 있어요 . 버전만 구할 수도 있어요 . 하지만 이름과 버전으로는 실제 패키지 이름을 알 수 없습니다 .rpm -q --provides <package name>
rpm -q --qf %{VERSION} <package name>
rpm -q --whatprovides

나는 또한 그것을 시도했지만 rpm -q --provides foofoox가 설치되고 foo = 2가 제공되었음에도 불구하고 원래 foo = 1만 얻습니다.

내가 원하는 것은 다음과 같은 마법입니다.

$ rpm -q --whatprovides "foo = 2"
$ foox

답변1

꽤 가깝습니다.

rpm -q --whatprovides "foo = 2"

그러나 버전을 허용하지 않습니다. 이렇게 하려면 한 단계 뒤로 돌아가서 출력 형식을 지정하세요.

rpm -q --whatprovides foo

이와 같이:

rpm -q --queryformat "%{VERSION}:%{NAME}\n" --whatprovides foo

그리고 grep("2" 선택)으로 결과를 필터링한 다음 sed로 결과를 필터링하여 추가 버전과 콜론을 제거합니다.

grep -E '/^2:/' | sed -e 's/^[^:]*://'

이는 패키지 이름만 제공합니다. 실제로는 버전, 릴리스 및 스키마가설치하다종속성을 수정합니다.

참고로:5.2.5. 특정 기능을 제공하는 패키지 확인(페도라 RPM 가이드)

OP의 의견과 관련하여 awk는 더 간단합니다.

awk -F: '{ if ($1 == "2") print $2}'

동의합니다(그러나 구성 스크립트의 관례에 따라 이식성이 약간 떨어지므로 awk 다음에 grep/sed를 사용하십시오). 그러나 주어진 값보다 크거나 같은 버전의 패키지를 확인하려면 awk가 훨씬 더 간단합니다.

awk -F: '{ if ($1 >= 2) print $2}'

오늘 아침에 떠나고 나서 그런 생각이 들었어요. 그러나 이러한 유형의 비교는 아마도 정확한 일치보다 사양 파일에서 더 일반적일 것입니다. 또한, 인용문으로 "2"인해 awk는 이를 숫자 대신 문자열로 처리하게 될 수도 있습니다. 이는 version 과 일치하지 않지만 2.0따옴표와 숫자를 해제하면 일치하게 됩니다.

@데이브 톰슨-085비교가 다음에 포함되어야 함을 나타냅니다.행동불필요합니다. 즉, 모든 행에 대해 앞 부분 {}뒤 부분이 하나의 동작입니다(패턴이 제공되지 않으므로). mawk에서 인용함매뉴얼 페이지:

AWK 프로그램은 일련의무늬 {행동}쌍 및 사용자 기능 정의.

그런 다음

   A pattern can be:
          BEGIN
          END
          expression
          expression , expression

표현은 아마도정규식, 하지만 그럴 수도 있습니다.비교하다. 그가 제안한 개선 사항은 다음과 같습니다.

awk -F: '$1>=2{print $2}'

관련 정보