RPM이 최소한 Linux에서 특정 버전인지 확인하는 스크립트를 작성해야 합니다.
- 질문 1:".src.rpm"까지의 버전을 포함하도록 변수 $RPM_VERSION에서 RPM 버전을 어떻게 구합니까?
- 질문 2:이 두 버전을 비교하는 가장 좋은 방법은 무엇입니까?
예: rpm-4.2-9.69.src.rpm을 rpm-4.14-0.69.src.rpm과 비교합니다. 이것은 내 시도이지만 작동하지 않습니다.
STR_BASE_ACCEPTABLE_VER="rpm-4.2-0.69.src.rpm"
if [[ "$RPM_VERSION" < "$STR_BASE_ACCEPTABLE_VER" ]]; then
echo "$RPM_VERSION is too low..." \
else
echo "$RPM_VERSION is fine" \
fi
답변1
구문 분석된 버전
해키 방식
첫 번째 부분에서는 아래와 같이 RPM에 특정 버전 정보를 쿼리하겠습니다.
$ rpm -qi vim-enhanced | grep Version
Version : 7.4.417
그러면 다음과 같이 구문 분석할 수 있습니다.
$ rpm -qi vim-enhanced | awk -F': ' '/Version/ {print $2}'
7.4.417
이는 다음과 같은 변수로 캡처될 수 있습니다.
$ RPM_VERSION=$(rpm -qi vim-enhanced | awk -F': ' '/Version/ {print $2}')
$ echo $RPM_VERSION
7.4.417
쿼리 형식 사용
이 도구는 생성되는 출력을 사용자 정의할 수 있는 rpm
도구도 제공합니다 . 이를 알고 있으면 다음과 같이 "VERSION" 매크로를 인쇄 --queryformat
할 수 있습니다 .rpm
$ rpm -q --queryformat '%{VERSION}' vim-enhanced
7.4.417
변수에 넣으십시오.
$ RPM_VERSION=$(rpm -q --queryformat '%{VERSION}' vim-enhanced)
노트:--querytags
스위치를 사용하여 모든 쿼리 태그를 볼 수 있습니다 rpm
. 예를 들면 다음과 같습니다.
$ rpm --querytags | head -5
ARCH
ARCHIVESIZE
BASENAMES
BUGURL
BUILDARCHS
버전 비교
비교가 더 까다로워질 것입니다. 다행히 rpmdevtools
패키지에는 rpmdev-vercmp
.
용법
$ rpmdev-vercmp --help
rpmdev-vercmp <epoch1> <ver1> <release1> <epoch2> <ver2> <release2>
rpmdev-vercmp <EVR1> <EVR2>
rpmdev-vercmp # with no arguments, prompt
Exit status is 0 if the EVR's are equal, 11 if EVR1 is newer, and 12 if EVR2
is newer. Other exit statuses indicate problems.
반환된 종료 상태를 확인하면 도구에 요청하고 RPM의 두 가지 이름을 제공하여 어떤 버전이 최신인지 확인할 수 있습니다.
예
$ rpmdev-vercmp rpm-4.2-9.69 rpm-4.14-0.69
rpm-4.2-9.69 < rpm-4.14-0.69
$ echo $?
12
따라서 종료 코드 12를 기준으로 두 번째 매개변수는 2개의 매개변수 중 최신 매개변수가 됩니다.
함께 넣어
귀하의 솔루션은 다음과 같습니다
rpmdev-vercmp $RPM_VERSION $STR_BASE_ACCEPTABLE_VER > /dev/null
if [[ $? == 12 ]]; then
echo "$RPM_VERSION is too low..."
else
echo "$RPM_VERSION is fine"
fi
따라서 변수를 다음과 같이 설정하면:
$ STR_BASE_ACCEPTABLE_VER="rpm-4.2-9.69"
$ RPM_VERSION="rpm-4.14-0.69"
$ ./cmp_rpmvers.bash
rpm-4.14-0.69 is fine
교체하는 경우:
$ STR_BASE_ACCEPTABLE_VER="rpm-4.14-0.69"
$ RPM_VERSION="rpm-4.2-9.69"
$ ./cmp_rpmvers.bash
rpm-4.2-9.69 is too low...
답변2
~을 위한질문 2(rpmdevtools가 없어 설치할 수 없는 경우):
최소 설치에서는 yum이 있어야 하므로 Python과 rpm Python 패키지도 있어야 합니다. 그런 다음 두 버전을 비교하면 다음과 같습니다.
python -c "import sys,rpm; print rpm.labelCompare((None, '$VER1', '$REL1'), (None, '$VER2', '$REL2'));"
"rpm-4.14-0.69" 패키지 이름이 주어지면 $VER는 버전 부분(4.14)이고 $REL은 릴리스 부분(0.69)입니다. 패키지 이름을 "-"로 구분하여 추출할 수 있습니다. 귀하의 예제에는 패키지 이름에 epoch가 포함되어 있지 않기 때문에 여기서는 epoch 부분을 None으로 설정했습니다.
labelCompare의 결과는 0, 1 또는 -1입니다.
실제로 rpmdev-vercmp 또는 rpmdev-sort(https://fedorahosted.org/releases/r/p/rpmdevtools/) 간단한 Python 스크립트이므로 rpmdevtools를 설치하지 않고도 사용할 수 있습니다.