3

如果我的 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 里面的安装?

4

1 回答 1

0

我记得有一些 dpkg 开关可以禁用 preinst/postinst 脚本的执行(检查 dpkg 手册页),但是如果你已经开始安装并且它坏了(因为它有时会发生)并且你无法摆脱错误循环,最简单的方法是放

exit 0

在 /var/lib/dpkg/info/PACKAGENAME.postinst (或分别为 preinst )

我相信安装必须成功或不成功完成(如果第二个则必须手动清除包),因此在 preinst/postint 脚本中不会有一些“取消,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 

通常,依赖项是提供一种有条件的安装或删除的方式。您可能想要创建虚拟依赖或依赖包,这将在安装之前或之后失败并触发依赖警告。然后,此类包将列在“自动删除”列表中。

于 2013-07-18T17:22:00.893 回答