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

时间:2015-01-22 12:43:27

标签: linux bash ubuntu deb debian-based

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

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

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

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

1 个答案:

答案 0 :(得分:1)

问题不在于Ubuntu,而是在HOME中使用postinst。它显然恰好与您自己的帐户sudo dpkg一起使用(尽管在某些情况下,sudo也不会传播您的HOME,但这不受支持或定义明确。< / p> 无论如何,

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的目录。这同样具有侵入性,但至少它可以避免破坏您的用户。数据完全是愚蠢的错误。