web-dev-qa-db-ja.com

パッケージがAPT

パッケージがインストールされているかどうかをテスト/レポートするシェルスクリプトメソッドが必要です。詳細は必要ありません。ロジックフローを設定するためにブール値を返すだけです。 パッケージがインストールされているかどうかを確認 を見ましたが、dpkgは複雑な出力を返し、パッケージがDebianリポジトリにあるかUbuntuPPAにあるかによってフォーマットが変わります。

見つけた apt-cacheはかなり良い仕事をしていて、私はこの方法を思いついた:

is_installed=0
test_installed=( `apt-cache policy package-name | grep "Installed:" ` )
[ ! "${test_installed[1]}" == "(none)" ] && is_installed=1

誰かがもっと簡単な、またはもっと直接的な方法を知っていますか?

10
tahoar

dpkg-queryあなたのリンクされた投稿のように、例えばを使用することを除いて、仕事のための最も正しいツールのようです。このようなスクリプトコンテキストでPythonシステムに直接バインドするための利用可能なAPTライブラリ。

dpkg-query

dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'

Trueを返します(終了ステータス0シェルスクリプト内)パッケージがインストールされている場合、false(終了ステータス1) さもないと。

  • -Wは「表示」を意味します(dpkg-query要求されたアクションが必要です)。
  • -f出力の形式を変更します。
  • db:Status-abbrevはパッケージステータスの短縮形です。
  • 2>/dev/null沈黙dpkg-query無効なパッケージ名が指定された場合。これをどのように処理するかは、ケースバイケースの問題である可能性があります。
  • grep -q一致する場合はtrueを返し、一致しない場合はfalseを返します。

頻繁に使用する場合は、単純な関数にすることができます。

#!/bin/sh
debInst() {
    dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'
}

if debInst "$1"; then
    printf 'Why yes, the package %s _is_ installed!\n' "$1"
else
    printf 'I regret to inform you that the package %s is not currently installed.\n' "$1"
fi

または単に

#!/bin/sh
if dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'; then
    printf 'Why yes, the package "%s" _is_ installed!\n' "$1"
else
    printf 'I regret to inform you that the package "%s" is not currently installed.\n' "$1"
fi
12

私はこれらの結果で3つのパッケージでダニエルの提案をテストしました:

  1. ネイティブDebianリポジトリパッケージがインストールされていません:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' Apache-Perl
    ~$ echo $?
    1
    
  2. ホストに登録され、インストールされているPPAパッケージ:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' libreoffice
    ~$ echo $?
    0
    
  3. ホストに登録されているがインストールされていないPPAパッケージ:

    ~$ dpkg-query -Wf'${db:Status-abbrev}' domy-ce
    ~$ echo $?
    0
    ~$ Sudo apt-get remove domy-ce
    [Sudo] password for user: 
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Package domy-ce is not installed, so not removed
    0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
    

このアプローチは気に入っていますが、PPAパッケージのリターンコードを信頼できないようです。それを除けば、私はapt-cache policyコマンドの戻り値を解析することに固執すると思います。

1
tahoar

ダニエル・アンダーソンの答えは好きですが、うまくいきませんでした。私はUbuntu12.04を使用しています。

dpkgのマニュアルページ から、db:Status-abbrev dpkg 1.16.2+でのみ機能します:

          db:Status-Abbrev
                 It  contains the abbreviated package status, such as “ii”
                 (since dpkg 1.16.2).

私の解決策は、レガシー動作を使用することでした。Statusフォーマッターだけです。

dpkg-query -Wf'${Status}' {my_pkg_name}

出力

install ok installed 

これが他の表現の「ii」のインスピレーションだったと思います。

したがって、Daniel Anderssonの回答を古いバージョンのdpkg、つまり古いUbuntuディストリビューションで動作するように完全に適合させるには、次のようにします。

dpkg-query -Wf'${Status}' {your_pkg_name} 2>/dev/null | grep -q "install ok installed"

戻り値:

  • 0-パッケージがインストールされている、または
  • 1-パッケージがインストールされていません。
1
Wilbur Whateley
#!/bin/bash

# Check for dependencies 
check_deps () {
DEPS=$(echo {dialog,sqlite3,openssh-client})
for i in $DEPS ; do
    dpkg-query -W -f='${Package}\n' | grep ^$i$ > /dev/null
    if [ $? != 0 ] ; then
        echo "Installing deps ..."
        aptitude install $i -y > /dev/null
    fi
done  
}

# execute the check_deps function
check_deps