web-dev-qa-db-ja.com

Debianにパッケージが存在するかどうかをbashから確認する方法

MySQLサーバーをインストールしたいインストールbashスクリプトを書きたいのですが。

Linux Mintでは、私はコードに従っていました:

apt-get -y --force-yes install mysql-server-5.6

しかし、私は新しいDebian 8をインストールしましたが、mysql-serverはなく、代わりにmariadbがあります。

パッケージが存在するかどうかを確認するにはどうすればよいですか?

パッケージがインストールされているかどうかを示すdpkg -sがあることを知っています。

12
Dusan Plavak

(以下はUbuntuからのものですが、同じ手法が明らかにDebianでも機能します)

$ apt-cache show screen
Package: screen
Priority: optional
Section: misc
Installed-Size: 950
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Axel Beckert <[email protected]>
Architecture: AMD64
Version: 4.1.0~20120320gitdb59704-9
Depends: libc6 (>= 2.15), libpam0g (>= 0.99.7.1), libtinfo5
Suggests: iselect (>= 1.4.0-1) | screenie | byobu
Filename: pool/main/s/screen/screen_4.1.0~20120320gitdb59704-9_AMD64.deb
Size: 645730
...

パッケージが存在する場合、情報が表示されます。そうでない場合は、次のように表示されます。

$ apt-cache show foobar
N: Unable to locate package foobar
E: No packages found

さらに、一致するパッケージが見つからない場合、apt-cacheの終了コードはゼロ以外になります。

追加メモ:apt-cache show packageを使用している場合、パッケージは仮想パッケージ(存在しないが、たとえば他のパッケージによって参照されているもの)であれば、次のようになります。 :

N: Can't select versions from package 'package' as it is purely virtual
N: No packages found

これのexit codeはゼロです(これは、私の意見では少し誤解を招くようです)。

13
EEAA

私は使うだろう dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed"

mysql-serverパッケージがインストールされており、インストールされている場合は、この事実が画面に出力されます。より洗練されたソリューションは、bash(テストされていない)の場合:

function package_exists() {
    return dpkg -l "$1" &> /dev/null
}

そのため、スクリプトで次のことができます。

if ! package_exists mysql-server ; then
    echo ”Please install mysql-server!"
fi
4

ワンライナーでは:

apt-cache pkgnames | grep -q "\<$your_package_name\>"

存在する場合は0、存在しない場合は1で終了します。

ボーナス:ファイル「packages_we_want」にリストされている、複数のパッケージの効率的なチェック、1行に1つ、sortでソート:

apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_wantは必要なすべてのパッケージをリストしますが、リポジトリにはしないでくださいが存在します。

apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_wantは、リポジトリに存在し、必要なすべてのパッケージをリストします。

0
Shnatsel