为什么 postinst 脚本在通过 Ubuntu 软件中心安装 debian 软件包时不执行命令?

Why does postinst script not execute commands while installing a debian package through Ubuntu software centre?

我已经创建了一个 debian 包并在 postinst 脚本中添加了以下代码:

path="$HOME/sample"
echo "$path"
if [ -d "$path" ]
then
 rm -rf "$path"
 echo 'File deleted successfully :)'
fi

这样,如果路径存在,它会在安装过程中将其删除。当我通过 dpkg 安装我的 .deb 包时,它工作得很好。但是通过 Ubuntu 软件中心安装时,none 可以正常工作。为什么会这样?

作为背景,我做了一个应用程序,它会在安装到系统的用户或根目录的主目录中创建一个目录。所以如果我在卸载后重新安装或重新安装,我需要检查目录是否存在与否;如果存在,我需要将其删除。我已将该应用程序作为 Debian 软件包分发。所以问题是如何检查目录是否存在于主目录中?安装应用程序时不会创建该目录。它是在 运行 应用程序时从外部创建的。另请注意,我无法将其更改为其他文件夹,因为无法更改应用程序。

问题不在于 Ubuntu,而在于您在 postinst 中使用了 HOME。它显然恰好与您自己的帐户中的 sudo dpkg 一起使用(尽管在某些设置中,sudo 也不会传播您的 HOME ),但这不受支持或定义不明确。

HOME 在 Debian 软件包中没有任何意义,因为它是系统范围的安装,而 HOME 是每个用户的变量。

如果我对您的要求理解正确,您需要遍历所有用户的主目录,并从每个用户的主目录中删除 sample 文件夹(如果存在)。

# Ad-hoc
getent passwd | cut -d: -sf6 |
while read dir; do
    test -d "$dir" || continue
    rm -rvf "$dir/sample"
done

非常 具有侵入性,因此您真的应该尝试更改应用程序——如果用户出于其他原因有一个名为 sample 的目录怎么办?该应用程序应该使用合理唯一的点名称 (.appname-sample?),或者将其每个用户的数据存储在系统可以正确管理的位置。

事实上,与此同时,您的 postinst 脚本应该只将 sample 目录移动到 .sample.dpkg-old 之类的目录。这同样具有侵入性,但至少可以避免因愚蠢的错误而完全破坏用户的数据。