パッケージをインストールするスクリプトを作成しようとしていますが、後でスクリプトが失敗した場合は、インストールしたものをすべてロールバックします。もちろん、ユーザーが以前にパッケージを既にインストールしている場合は、そのパッケージをアンインストールしたくありません。パッケージが以前にyum経由でインストールされているかどうかをスクリプトで確認するにはどうすればよいですか?
準関連 StackOverflowの質問 で以下を見つけました。私が必要とする答えは、実際にはそこでの質問に完全には答えなかった(そして、正しい答えとして選択されなかった)ので、他の人が簡単に見つけられるように、ここに投稿すると思いました。
yum list installed PACKAGE_NAME
このコマンドは人間が読める出力を返しますが、より重要なのは終了ステータスコードを返します。 0はパッケージがインストールされているがインストールされていることを示し、1はパッケージががインストールされていないことを示します(パッケージが有効かどうかはチェックしないため、tracerouteがインストールされていない場合、yum list installed herpderp-beepbopboop
はyum 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
よりも、出力を抑制するためのすべてのリダイレクトがあります。
「yumを介して」という質問の前提条件を正確に満たすのではなく、「yum -q list」よりも高速です。
rpm -q <package_name>
インストールされている可能性のあるバージョンの正確な名前と、インストールされている場合はエラーコード「0」、インストールされていない場合は「1」を返します。
よりシンプルなワンライナー:
yum -q list installed packageX &>/dev/null && echo "Installed" || echo "Not installed"
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配列に、インストールするパッケージをリストするか、インストールされているかどうかを確認します。
戻り値を読み取ることもできます$?
yumから。 yumがどのような問題に遭遇したかに応じて、すべてがうまくいったか、ポジティブである場合は、0になるはずです。これは、何かが失敗した場合に別のアクションを実行したい場合に適した方法です。