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 を使用したことがない><ために、他の方法を使用してしまいました。
行いたいことは実現できましたけれども、シェルスクリプトのみを読んだときに意図が伝わるかしら、、、少し心配ですの。
今回のコードは、次のリポジトリで使用いたしました。
最後に、次のページが参考になりました。ありがとう存じます!
以上です。