-1

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

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

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

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

4

1 回答 1

2

问题不在于 Ubuntu,而在于您HOMEpostinst. 它显然恰好可以sudo dpkg通过您自己的帐户使用(尽管在某些设置中,sudo不会传播您的HOMEthen),但这不受支持或未明确定义。

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

于 2015-01-23T06:48:49.200 回答