为什么 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
之类的目录。这同样具有侵入性,但至少可以避免因愚蠢的错误而完全破坏用户的数据。
我已经创建了一个 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
之类的目录。这同样具有侵入性,但至少可以避免因愚蠢的错误而完全破坏用户的数据。