我正在创建一个需要 java oracle >= 7 的 deb 包。因此,我编写了一个简单的带有 bash 脚本的 preinst 文件,它将弹出一条消息(使用 zenity),警告用户需要安装它。但是,当通过 Ubuntu 软件中心安装 deb 包时,它会在弹出消息之前崩溃。请帮我修复它。
编辑:这发生在 Ubuntu 15.04 64/32 位上。
预安装文件:
#!/bin/bash
JAVA_VERSION=`echo "$(java -version 2>&1)" | grep "java version" | awk '{ print substr($3, 2, length($3)-2); }'`
if [[ "$JAVA_VERSION" = *"1.7"* ]] || [[ "$JAVA_VERSION" = *"1.8"* ]]; then
echo 'java is ok'
exit 0
fi
zenity --error --text="Please install java oracle 7 or newer. \"Ok\", exiting instalation"
exit 1
安装日志:
Reading database ... 100%
(Reading database ... 171184 files and directories currently installed.)
Preparing to unpack .../usb/test.deb ...
gdk_mir_display_open
Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused (zenity:3179): Gtk-WARNING **:
cannot open display: dpkg: error processing archive /media/test/usb/test.deb (--install):
subprocess new pre-installation script returned error exit status 1
Errors were encountered while processing: /media/test/usb/test.deb
答案1
我发现这个选项:需要将“export DISPLAY=:0”添加到 zenity 脚本行。
export DISPLAY=:0 && zenity --error --text="Please install java oracle 7 or newer. \"Ok\", exiting installation"
但对我来说没用。奇怪的是,每隔 20 次左右的测试它就会起作用。
对我来说最好的方法是放弃 zenity 并使用 debconf。Debconf 教程链接. 注意:输入窗口的优先级需要很高或者很关键,否则不会显示。
答案2
我的回答有些晚了,但作为将来的参考,我可以看到三个直接的问题:
您没有
-e
在顶部设置 Debconf 所需的标志。您不需要
/usr/share/debconf/confmodule
在所有控制脚本中找到必须的源代码。的输出
zenity
不会被重定向到变量或者任何可能干扰 Debconf 通信协议的地方。
如果可以的话,最好使用 Debconf。