【问题标题】:Cancel debian package installation inside preinst script在 preinst 脚本中取消 debian 包安装
【发布时间】:2013-07-18 13:31:09
【问题描述】:

如果我的预安装脚本检查失败,我想取消安装 .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里面的安装?

【问题讨论】:

    标签: debian installation-package


    【解决方案1】:

    我记得有一些 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 
    

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

    【讨论】:

    • 拥有一个在其安装或删除脚本中的包会自己调用来扰乱包系统似乎是一个可怕的想法。
    • 正确,即使有可能——根据“unix 在哪里有办法”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多