meaning of $1 in RPM SPEC file

http://www.vinelinux.org/manuals/making-rpm-9.html

にあった内容を念の為確認。結果は正しい。
http://www.momonga-linux.org/~tamo/RPM-Tips_all.html とかには、

よく %post 等では $1 で条件を付けていますが、あの秘密を伝授しましょう。最初のインストールでは 1, アップグレイドでは 2, アンインストール時には 0 です。実は、それだけです。アップグレイドの時は実行せず、最初のインストールの時だけ実行したいときには %post (または %pre) で $1 が 1 かどうかを確かめれば良いというわけです。

みたいに書いてあるが、アップグレードの時の記述は厳密ではない、という理解。

  • 確認したバージョン
[root@dl140 NOTRUN x86_64]# rpm --version
RPM バージョン 4.4.2
[root@dl140 NOTRUN x86_64]#
%define dbgf            /tmp/debug
<省略>

%pre
echo "pre: $1: `date`" >> %{dbgf}

%post
echo "post: $1: `date`" >> %{dbgf}

%preun
echo "preun: $1: `date`" >> %{dbgf}

%postun
echo "postun: $1: `date`" >> %{dbgf}

result

pre: 1: 2009525日 月曜日 19:07:43 JST
post: 1: 2009525日 月曜日 19:07:45 JST
  • "-e"
preun: 0: 2009525日 月曜日 19:07:50 JST
postun: 0: 2009525日 月曜日 19:07:50 JST
  • "-i"
pre: 1: 2009525日 月曜日 19:07:56 JST
post: 1: 2009525日 月曜日 19:07:58 JST
  • "-U"
pre: 2: 2009525日 月曜日 19:08:03 JST
post: 2: 2009525日 月曜日 19:08:06 JST
preun: 1: 2009525日 月曜日 19:08:06 JST
postun: 1: 2009525日 月曜日 19:08:06 JST

結論

下記のコードをテンプレートに、対応するイベントのif内に書けば良い

%pre
if [ "$1" = 1 ]; then echo "pre: -i" ; fi
if [ "$1" = 2 ]; then echo "pre: -U" ; fi

%post
if [ "$1" = 1 ]; then echo "post: -i" ; fi
if [ "$1" = 2 ]; then echo "post: -U" ; fi

%preun
if [ "$1" = 0 ]; then echo "preun: -e" ; fi
if [ "$1" = 1 ]; then echo "preun: -U" ; fi

%postun
if [ "$1" = 0 ]; then echo "postun: -e" ; fi
if [ "$1" = 1 ]; then echo "postun: -U" ; fi