Spec檔案中判斷是更新or解除安裝
我們在寫spec檔案時,有pre、post、preun、postun等子產品用于訓示安裝前後以及解除安裝前後要執行的動作,而軟體更新實際上是先解除安裝後安裝的過程,是以這些子產品内動作的編寫需要區分是解除安裝還是更新以便采取不同的動作。
那麼如何來進行區分呢?
腳本片段傳遞一個參數,用于表示本軟體包的個數。執行特定動作時,通過向
$1
傳遞不同值,來表示不同動作(安裝/更新/解除安裝),除了 %pretrans 和 %posttrans 它們的
$1
為 0 (rpm 4.4+ 支援 %pretrans 和 %posttrans)。對于安裝、更新和解除安裝,所傳遞的參數值如下表所示:
項目 | 安裝(install) | 更新(update/upgrade) | 解除安裝(remove/erase) |
---|---|---|---|
%pre | ==1 | == 2 | (N/A) |
%post | == 1 | == 2 | (N/A) |
%preun | (N/A) | == 1 | == 0 |
%postun | (N/A) | == 1 | == 0 |
%pretrans | == 0 | == 0 | (N/A) |
%triggerprein | 安裝本包: == 0, == 1 安裝目标包: == 1, == 0 | == 1, == 1 | (N/A) |
%triggerin | == 1, == 1 | 更新本包: == 2, == 1更新目标包: == 1, == 2 | (N/A) |
%triggerun | (N/A) | == 1, == 1 | 解除安裝本包: == 0, == 1解除安裝目标包: == 1, == 0 |
%triggerpostun | (N/A) | 更新目标包: == 1, == 1 | 解除安裝目标包: == 1, == 0 |
%posttrans | == 0 | == 0 | (N/A) |
注意,如果安裝相同軟體包的多個版本,這些參數值将會不同(這發生于同時安裝包,如 kernel 和 multilib 包。然而,它會引發錯誤,防止軟體包更新完成)。是以,使用以下結構的腳本是個好主意:
%pre
if [ $1 -gt ] ; then # -gt大于
fi