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


76

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

回答:


77

半関連のStackOverflowの質問で次のことがわかりました。私が必要とする答えは、実際にはそこの質問に完全には答えていませんでした(そして正しい答えとして選択されませんでした)。

yum list installed PACKAGE_NAME

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

出力はやや直感に反するので、ラッパー関数で@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への呼び出しでステートメントtruefalse値のbashを返すことを期待しながら、(偽のために、真の場合は1を、すなわち0)を、直感的/機能をより読みやすくするのに役立ちます。

スクリプトで1つのパッケージだけをチェックしている場合は、yum list installed直接テストした方が良いかもしれませんが、(IMHO)この機能により、何が起こっているかを理解しやすくなり、その構文はyumすべてのリダイレクトよりもはるかに簡単に覚えられます出力を抑制します。


2
の値を手動で確認する必要はありません。$?コマンドを条件にラップするだけです:if yum list installed "$package" >/dev/null 2>&1; then [...]
Chris Down 14

1
私はあなたのエコー文が逆になっていると思いますか?isInstalledパッケージがインストールされている場合は1を返します。ただし、bashでは1がfalseと評価されるため、「not installed」がエコーされます。
FGreg

@FGreg good call ... returnステートメントをtrueand への呼び出しに置き換えたfalseため、関数は簡単に読み取り可能ですが、bashが期待する出力を返します。
ドクターJ

5
OMGそれは21世紀です。パッケージがインストールされているかどうかを判断する適切なオプションがないので、書き込み機能やライナーはありません!?
スニルD.

21

質問「via yum」の前提条件を完全に満たしているわけではありませんが、「yum -q list」よりも高速です。

rpm -q <package_name>

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


+1の方が速いため
フレディファブレガス

rpmローカルパッケージマネージャーであるため、間違いなく高速です。yumリモートリポジトリにパッケージを扱うためである
Sergiy Kolodyazhnyy

9

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

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

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.