パッケージがインストールされているかどうかを確実に確認する


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

そして、返された文字列が空であったかどうかをチェックするためのフラグ-n-zフラグもあります。ここでいくつかの良い感覚を逃しているのは確かです。

パッケージが実際にインストールされているかどうかを確認するために私ができることはありますか?

ありがとう!


apt-get installインストール済みのパッケージを要求した場合、どんな害がありますか?あなただけを呼び出すことができますapt-get install $MISC $WEB
ジャーノ

回答:


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:出力を/dev/null必要とせず、終了コードのみが必要なため、stdinとstderrの両方を指定されたファイル(この場合)にリダイレクトします。bash(スクリプトの最初の行にある必要があります#!/bin/bash)でのみ機能します>/dev/null 2>&1
enzotib

@Taymon:前のソリューションで欠陥を見つけたため、ロジックを変更しました。
-enzotib

注意:bashを使用してpipefailオプションが設定されている場合、grep -qはHeisenbugsを生成できます。基本的に、grepはdpkgが書き込みを終了する前に終了します(その場合は0の終了ステータスが必要です)ので、dpkgはパイプへの書き込みに失敗します(代わりに0以外の終了ステータスを生成します)。pipefailが設定されていないことを確認するか、「-q」オプションの(おそらく小さな)効率向上を放棄してください。
ロン・バーク

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.