我为 Debian 开发了一个应用程序,并使用 equivs-build 创建了 .deb 安装包。我用来创建包的控制文件有一行运行 postinst 脚本 setup.sh。在这个文件中,我尝试使用几种方法获取用户的登录名,包括:
USER=$(logname)
USER=$(who am i | awk '{print $1}')
当我在终端窗口中以 root 身份尝试这些方法时,它们都能正常工作。不幸的是,它们在安装过程中全部失败,并且登录用户名被检索为“root”。这导致脚本中的所有路径都是错误的,并且脚本以错误退出,导致软件中心显示错误消息并停止安装。
但是,使用 dpkg 如下安装包,我的应用程序就安装成功了。
dpkg -i package-name
那么,为什么会发生这种情况?如何正确获取登录名?
答案1
你想做的事无法可能工作正常。
.deb
包裹是不是每个用户都是私有的——它们都是在系统范围内安装的,这就是为什么“logname”输出显示“root”——因此它们的工作方式必须相同全部用户,并且不能将任何人的主目录硬编码到系统范围的配置文件中。
请记住,Linux 是一个多用户操作系统——可以创建多个用户帐户,甚至可以同时登录。因此,如果您的软件包出现这种情况,那么它只对安装它的人有效,但该计算机上的其他人将无法使用!
这里与软件中心的区别dpkg
在于,前者执行所有操作并直接运行脚本,因此安装后脚本仍在用户的登录会话中运行。但是,软件中心将实际安装委托给后台服务,该服务在任何登录会话“之外”运行,并且不以任何方式与用户交互。