bash 스크립트에서 yum을 통해 패키지가 설치되었는지 어떻게 알 수 있습니까?


75

패키지를 설치하는 스크립트를 작성하려고하지만 나중에 실패하면 나중에 스크립트에서 설치된 항목을 롤백합니다. 물론 사용자가 이미 패키지를 이미 설치 한 경우 그 아래에서 패키지를 제거하고 싶지 않습니다. 스크립트에서 yum을 통해 패키지가 이전에 설치되었는지 어떻게 알 수 있습니까?

답변:


76

세미 관련 StackOverflow 질문 에서 다음을 발견했습니다 . 내가 필요한 대답은 실제로 거기에있는 질문에 대답하지 않았으며 (정답으로 선택되지 않았습니다) 그래서 다른 사람들이 쉽게 찾을 수 있도록 여기에 게시 할 것이라고 생각했습니다.

yum list installed PACKAGE_NAME

이 명령은 사람이 읽을 수있는 출력을 반환하지만 더 중요한 것은 종료 상태 코드를 반환합니다. 0은 패키지 설치되었음을 나타내고 1은 패키지 설치 되지 않았 음을 나타냅니다 (패키지가 유효한지 여부를 확인 하지 않으므로 추적 경로를 설치하지 않은 yum list installed herpderp-beepbopboop것처럼 "1"을 반환 함 yum list installed traceroute). 나중에 "$?"를 확인할 수 있습니다 이 종료 코드의 경우

출력은 다소 반 직관적이기 때문에 래퍼 함수에서 @Chris Downs의 "축소 된"버전을 사용하여 출력을보다 "논리적"으로 만들었습니다 (예 : 1 = 설치된 0 = 설치되지 않음).

function isinstalled {
  if yum list installed "$@" >/dev/null 2>&1; then
    true
  else
    false
  fi
}

사용법은

if isinstalled $package; then echo "installed"; else echo "not installed"; fi

편집하다:

대체 return에 전화로 문의 true하고 false값 강타를 반환하는 기대하면서 (거짓을 위해, 진정한 1을 즉, 0), 직관적 인 / 기능이 더 읽을 수 있도록 도움이됩니다.

스크립트에서 하나의 패키지를 확인하는 경우 yum list installed직접 테스트하는 것이 더 나을 수도 있지만 (IMHO) 함수를 사용하면 진행 상황을 쉽게 이해할 수 있으며 구문은 yum모든 리디렉션 보다 기억하기가 훨씬 쉽습니다. 출력을 억제합니다.


2
의 값을 수동으로 확인할 필요는 없으며 $?명령을 조건부로 감싸면됩니다.if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Down

1
반향 음이 거꾸로 된 것 같아요? isInstalled패키지가 설치된 경우 1을 반환합니다. bash에서 1은 false로 평가되므로 "설치되지 않음"이 에코됩니다.
FGreg

@FGreg good call ... return문을 trueand에 대한 호출 로 바 꾸었 false으므로 함수를 쉽게 읽을 수 있지만 bash가 기대하는 출력을 반환합니다.
Doktor J

5
OMG 그것은 21 세기인데 패키지가 설치되어 있는지 알려주는 옵션이 없으므로 쓰기 기능이나 라이너가 하나도 없습니다!?
Sunil D.

21

"via yum"이라는 질문의 전제 조건을 정확히 충족 시키지는 않지만 "yum -q list"보다 빠릅니다.

rpm -q <package_name>

설치된 버전의 정확한 이름과 오류 코드 "0"(설치된 경우) 및 그렇지 않은 경우 "1"을 반환합니다.


이게 더 빠르기 때문에 +1
Freddie Fabregas

rpm로컬 패키지 관리자 이기 때문에 확실히 빠릅니다 . yum원격 저장소의 패키지 처리
Sergiy Kolodyazhnyy

9

더 간단한 oneliner :

yum -q list installed packageX &>/dev/null && echo "Installed" || echo "Not installed"

0

yum을위한 편리한 스크립트 :

#!/bin/sh pckarr=(wget mlocate bind-utils ANY_RANDOM_PACKAGE_NAME) yum update -y for i in ${pckarr[*]} do isinstalled=$(rpm -q $i) if [ ! "$isinstalled" == "package $i is not installed" ]; then echo Package $i already installed else echo $i is not INSTALLED!!!! yum install $i -y fi done updatedb

pckarr 배열에서 설치하거나 설치할 패키지를 나열하십시오.


0

$?yum 에서 반환 값 을 읽을 수도 있습니다 . yum이 어떤 종류의 문제에 부딪 쳤는지에 따라 모든 것이 효과가 있거나 긍정적이면 0이어야합니다. 무언가 실패하면 다른 조치를 취하려는 경우 좋은 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.