カテゴリー
Linux

インストール済みのパッケージを rpm で再度インストールしようとした時、if 無しでもシェルを止めない方法

Vagrant のプロビジョニング時、シェルファイルを幾つか組み合わせます。

シェルには set -eux を書いていますので、エラーが発生したタイミングで停止させております。

汎用性を高めるために、何度か同じパッケージを rpm でインストールするコマンドを書いています。

そうしますと、2 回目の rpm インストールでエラーと扱われてしまい、シェルが止まってしまいました。

この状況を打開すべく、検討し、結果が出ましたのでメモいたします。

ポイント

  • >/dev/null 2>&1 で無視しようとしたが、エラー扱いとなり、シェルは止まってしまった。
  • rpm インストール前後で、シェルのデバッグモードのオンオフを切り替えることで対処した。
  • 具体的には、コマンド前に set +e し、コマンド実行し、最後に set -e する。

実践

実践 1. rpm -ivh で失敗

rpm -ivh で導入済みパッケージをインストールしようとするとエラーとなりシェルが止まりました><。

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
http://rpms.famillecollet.com/enterprise/remi-release-7.rpm を取得中
準備しています...              ################################# [100%]
	パッケージ remi-release-7.2-1.el7.remi.noarch は既にインストールされています。
# 

実践 2. >/dev/null 2>&1 で失敗

>/dev/null 2>&1 でインストール済みの出力は無くなりましたけれども、シェルは止まってしまいました><。

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm >/dev/null 2>&1
# 

実践 3. シェルのスクリプト中断設定を明示的に部分的にオフで成功

set -e を実行しておくことで、以降の各コマンド実行の終了ステータスが 0 以外の場合にスクリプトが中断されます。

JavaScript の use strict と同じ気持ちで、シェルスクリプトの品質を高く保つ目的で常に付けております。

今回の場合は、rpm -ivh を以前にも実行している場合でも受け入れたいですので、この set -e を意図的に、明示的にオフにすることといたしました。

# set +e
# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
http://rpms.famillecollet.com/enterprise/remi-release-7.rpm を取得中
準備しています...              
########################################
	パッケージ remi-release-7.2-1.el7.remi.noarch は既にインストールされています。
# set -e

おわりに

set +e ではなく、パッケージがインストールされているかを if 判定する方法もあると存じます。

わたくしが if 嫌いなうえ、そもそもシェルスクリプトで if を使用したことがない><ために、他の方法を使用してしまいました。

行いたいことは実現できましたけれども、シェルスクリプトのみを読んだときに意図が伝わるかしら、、、少し心配ですの。

今回のコードは、次のリポジトリで使用いたしました。

最後に、次のページが参考になりました。ありがとう存じます!

以上です。

コメントを残す