2013-07-18 206 views
3

如果我的preinst腳本中檢查失敗,我想取消安裝.deb軟件包。取消預安裝腳本中的debian軟件包安裝

我PREINST腳本:

#!/bin/sh 
# Stop if any error 
set -e 
assertexists(){ 
    # $1 File 
    if [ -e "$1" ] 
    then 
     echo "File existence checked for: $1" 
    else 
     echo "ERROR, file does not exist: $1" 
     exit 1 
    fi 
} 
assertexists "$JAVAPATH/bin/java" 

當我運行:

dpkg -i my.deb 

我看到錯誤,但是當我運行該程序包顯示爲已安裝:

dpkg --get-selections 

是否有如何取消preinst內的安裝?

回答

0

我記得有一些dpkg開關可以禁止執行preinst/postinst腳本(請查看dpkg聯機幫助頁),但是如果您已經開始安裝並且破譯(有時會發生),並且您無法避免出錯循環,最簡單的方法就是把

exit 0 
在/var/lib/dpkg/info/PACKAGENAME.postinst

(或分別PREINST)

我相信安裝必須成功或失敗結束(如果第二次再包必須用手清除),所以在preinst/postint腳本中不會有「cancel,remove_me()」的「官方」方式。在某些情況下,您可以將dpkg --purge放入腳本中,但由於鎖定或其他原因,我認爲它不會這樣做,寧願沒有任何意義。請注意,apt-get是如何進行多次安裝/刪除的 - 它通常首先刪除所有要刪除的軟件包,然後安裝其餘的軟件包。您也可以

echo PACKAGENAME purge | dpkg --set-selections 

然後

apt-get -f dselect-upgrade 

apt-get -f install 

但我認爲這不是它應該工作的方式。

您還可以通過手

dpkg -i mypackage.deb || dpkg --purge mypackage 

做一般情況下,依賴是提供有條件的安裝或拆卸的方式。您可能想要創建虛擬依賴或依賴包,這會在安裝之前或之後失敗並觸發相關性警告。這樣的軟件包將在「autoremove」列表中列出。

+2

有一個軟件包,它的安裝或刪除腳本使自己的調用與包系統混亂似乎是一個可怕的想法。 –

+0

是正確的,即使有可能 - 根據「哪裏有unix有辦法」 –