在preinst脚本中取消debian软件包安装

时间:2013-07-18 13:31:10

标签: debian installation-package

如果我的preinst脚本中的检查失败,我想取消安装.deb包。

我的预备脚本:

#!/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中取消安装?

1 个答案:

答案 0 :(得分: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”列表中。