web-dev-qa-db-ja.com

パッケージがbashスクリプトのyum経由でインストールされているかどうかを確認するにはどうすればよいですか?

パッケージをインストールするスクリプトを作成しようとしていますが、後でスクリプトが失敗した場合は、インストールしたものをすべてロールバックします。もちろん、ユーザーが以前にパッケージを既にインストールしている場合は、そのパッケージをアンインストールしたくありません。パッケージが以前にyum経由でインストールされているかどうかをスクリプトで確認するにはどうすればよいですか?

80
Doktor J

準関連 StackOverflowの質問 で以下を見つけました。私が必要とする答えは、実際にはそこでの質問に完全には答えなかった(そして、正しい答えとして選択されなかった)ので、他の人が簡単に見つけられるように、ここに投稿すると思いました。

yum list installed PACKAGE_NAME

このコマンドは人間が読める出力を返しますが、より重要なのは終了ステータスコードを返します。 0はパッケージがインストールされているがインストールされていることを示し、1はパッケージががインストールされていないことを示します(パッケージが有効かどうかはチェックしないため、tracerouteがインストールされていない場合、yum list installed herpderp-beepbopboopyum list installed tracerouteと同じように「1」を返します)。その後、「$?」を確認できます。この終了コード。

出力はやや直観に反するため、以下のラッパー関数で@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への呼び出しに置き換え、bashが期待する値を返します(つまり、trueの場合は0、falseの場合は1)。 。

スクリプトで1つのパッケージを確認するだけの場合は、yum list installedを直接テストした方がよい場合がありますが、(IMHO)関数を使用すると、何が起こっているのかを理解しやすくなり、構文が覚えやすくなりますyumよりも、出力を抑制するためのすべてのリダイレクトがあります。

80
Doktor J

「yumを介して」という質問の前提条件を正確に満たすのではなく、「yum -q list」よりも高速です。

rpm -q <package_name>

インストールされている可能性のあるバージョンの正確な名前と、インストールされている場合はエラーコード「0」、インストールされていない場合は「1」を返します。

23
Gerald Schade

よりシンプルなワンライナー:

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

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になるはずです。これは、何かが失敗した場合に別のアクションを実行したい場合に適した方法です。

0
Fever