패키지 설치 여부를 확실하게 확인


20

나는 간단한 요구 사항이 있습니다. 쉘 스크립트를 통해 설치하려는 지정된 수의 패키지에 해당하는 여러 변수를 정의하고 싶습니다.

아래 샘플 코드 :

MISC="shutter pidgin"
WEB="apache2 mongodb"

for pkg in $MISC $WEB; do
    if [ "dpkg-query -W $pkg | awk {'print $1'} = """ ]; then
        echo -e "$pkg is already installed"
    else
        apt-get -qq install $pkg
        echo "Successfully installed $pkg"
    fi
done

모든 것이 작동하지만 논리는 내가 원하는 패키지를 안정적으로 설치하지 않기 때문에 결함이있는 것 같습니다. 이미 설치되었거나 이전에 이미 설치 한 패키지를 설치하려고합니다.

나는 또한 command -v다음과 같이 노력했다 .

if [ "dpkg -l | awk {'print $2'} | grep --regexp=^$pkg$ != """ ]; then

그리고 -nand -z플래그를 사용하여 반환 된 문자열이 비어 있는지 확인하십시오. 여기에 좋은 감각이 빠져 있습니다.

패키지가 실제로 설치되었는지 확인하기 위해 무엇을 할 수 있는지 알고 있습니까?

감사!


apt-get install설치된 패키지 를 요청하면 어떤 피해가 있습니까? 당신은 그냥 전화 할 수 있습니다 apt-get install $MISC $WEB.
jarno

답변:


15

기본적으로 if조건을

if dpkg --get-selections | grep -q "^$pkg[[:space:]]*install$" >/dev/null; then

dpkg-query패키지는 제거되었지만 제거되지 않은 패키지에 대해서도 true를 반환하므로 사용할 수 없습니다.

또한 apt-get성공적인 메시지를 보내기 전에 종료 코드를 확인하는 것이 좋습니다 .

if apt-get -qq install $pkg; then
    echo "Successfully installed $pkg"
else
    echo "Error installing $pkg"
fi

무엇을 &>합니까?
Taymon

@Taymon : stdin과 stderr을 주어진 파일 ( /dev/null이 경우)로 리디렉션 하십시오. 출력이 필요하지 않고 종료 코드 만 필요하기 때문입니다. 그렇지 않으면 ( bash스크립트의 첫 줄만) 작동 #!/bin/bash합니다 >/dev/null 2>&1.
enzotib

@ 테이 몬 : 나는 이전 솔루션에서 결함을 발견했기 때문에 논리를 변경했습니다.
enzotib

bash를 사용하고 pipefail 옵션을 설정하면 grep -q가 Heisenbugs를 생성 할 수 있습니다. 기본적으로, dpkg가 쓰기를 마치기 전에 grep이 종료됩니다 (이 경우 0 종료 상태를 원함). dpkg가 파이프에 쓰기에 실패합니다 (대신 0이 아닌 종료 상태를 생성 함). pipefail이 설정되어 있지 않은지 확인하거나 "-q"옵션의 (아마도) 효율성 향상을 포기하십시오.
Ron Burk

2

dpkg-query로 테스트 할 수 있습니다.

if dpkg-query -W -f'${Status}' "$pkg" 2>/dev/null | grep -q "ok installed"; then

*와? $ pkg에 나타나면 와일드 카드입니다. 패키지가 손상되어 apt-get install --reinstall새 패키지를 설치하는 데 사용할 수있는 명령으로 다시 설치해야하는 경우 dpkg-query가 "ok installed"대신 "reinst-required installed"를 인쇄 할 수 있습니다.


0
#to check package is installed or not without distribution dependency
#!/bin/bash
read -p "Package Name: " pkg
which $pkg > /dev/null 2>&1
if [ $? == 0 ]
then
echo "$pkg is already installed. "
else
read -p "$pkg is not installed. Answer yes/no if want installation_ " request
if  [ $request == "yes" ]
then
yum install $pkg
fi
fi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.