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

Linux 为什么postinst脚本在通过Ubuntu软件中心安装debian软件包时不执行命令?,linux,bash,ubuntu,deb,debian-based,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包,并在postinst脚本中添加了以下代码:

path="$HOME/sample"
echo "$path"
if [ -d "$path" ]
then
 rm -rf "$path"
 echo 'File deleted successfully :)'
fi
因此,如果路径存在,它将在安装过程中删除它。当我通过
dpkg
安装.deb包时,它可以完美地工作。但是当通过Ubuntu软件中心安装时,没有一个是有效的。为什么会发生这种情况


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

问题不在于Ubuntu,而在于您在
postinst
中使用
HOME
。显然,它碰巧从您自己的帐户使用
sudo dpkg
(尽管在某些设置中,
sudo
也不会传播您的
主页
),但这是不受支持或定义不清的

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
的位置。这同样具有侵入性,但至少它避免了因愚蠢的错误而完全破坏用户的数据。

您希望
$HOME
包含什么?
postinst
脚本将作为
root
运行,它不应接触
/usr
之外的任何内容(可能还有
/etc
)无论如何。我指的是正在安装.deb包的根用户或用户的主路径。如果它没有接触到/usr之外,那么在使用dpkg命令时它怎么可能工作。我不理解你的问题。二进制文件安装在
/usr/bin
中,支持文件安装在
/usr/share
/usr/lib
中,配置文件安装在
/etc
中。我并不是说这在技术上是不可能的,您尝试的可能只是一个概念的快速证明,以帮助您理解如何做一些实际有用的事情,但我的第一步询问是更改脚本,以便您看到
$HOME
扩展到什么,或者为您的测试文件使用一个不太奇怪的位置。好的。我知道如果我在一个拥有su权限的用户中安装deb包会发生什么。在终端中执行sudo dpkg命令时,它会删除目录并显示用户的主路径。但是在使用ubuntu软件中心安装相同的deb包时,脚本是否没有执行?或者路径不可访问?我为dpkg和Ubuntu软件中心中使用的用户提供了相同的密码。
sudo
您自己的
$HOME
变量可能对
dpkg
可见,但这不是您通常可以依赖的。同样地,
$HOME
也不是一个在
postinst
中乱搞的好地方。我仍然希望这不是你的问题的核心,你真正想要完成的事情是可以实现的。好的,那么你能告诉我,当通过软件中心安装Debian软件包时,如何检查特定目录是否存在于root或user的主目录中?如果我使用的是类似于通知发送-u严重-i“测试”“新测试消息”“我仍然不明白
notify send
是如何体现这一点的。当
postinst
脚本运行时,您不能依赖用户登录,因此也不清楚应该在何处发送通知。作为粗略的近似,我在
rm
中添加了一个
-v
选项,使其在标准错误上显示删除的文件。如果通过例如
cron
调用,输出通常会通过电子邮件发送给管理员。是的,我收到了。非常感谢..帮助我…我能够得到结果..非常感谢。我已删除了notify send命令并使用了give循环,效果非常好..谢谢...)