postinst
我的 debian 软件包中有一个脚本:
#!/bin/bash
oqm-config -g system.hostname
RESULT="$?"
if [ "$RESULT" -eq 1 ]; then
oqm-config -s system.hostname $(hostname).local "."
fi
这是为了填充配置变量(如果不存在)。这些命令在安装过程之外起作用:
$ sudo ./test.sh
+ oqm-config -g system.hostname
ERROR: Config key not found: system.hostname
+ RESULT=1
+ [ 1 -eq 1 ]
+ hostname
+ oqm-config -s system.hostname oqm-demo.local .
{
"system": {
"hostname": "oqm-demo.local"
},
"captain": {},
"snapshots": {
"location": "/data/oqm-snapshots/",
"numToKeep": 5,
"frequency": "weekly"
}
}
但是,在安装期间执行时,初始返回的代码oqm-config -g system.hostname
始终是0
(或者更准确地说是空字符串?不确定为什么这个来自空字符串的特定错误应该是0
?):
Setting up open+quarter+master-manager-station+captain (1.0.18) ...
+ oqm-config -g system.hostname
ERROR: Config key not found: system.hostname
+ RESULT=0
+ '[' '' -eq 1 ']'
/var/lib/dpkg/info/open+quarter+master-manager-station+captain.postinst: line 5: [: : integer exp
ression expected
我是否遗漏了什么?
在 Ubuntu 20.04 上构建 debian 文件,尝试安装22.04
制作 debian 的文件(我知道这很混乱,但[通常]有效):https://github.com/Epic-Breakfast-Productions/OpenQuarterMaster/blob/dev.388-fr-finish-keycloak-infra-component/software/Station-Captain/makeInstallers.sh#L107-L117
答案1
问题是这样的:
cat <<EOT >> "$buildDir/$debDir/DEBIAN/postinst"
#!/bin/bash
oqm-config -g system.hostname
RESULT=$?
if [ $RESULT -eq 1 ]; then
oqm-config -s system.hostname $(hostname).local "."
fi
EOT
Bash 执行参数扩展,其中包括:异端:
如果
word
不加引号,则此处文档的所有行都将经过参数扩展、命令替换和算术扩展,字符序列\newline
将被忽略,并且\
必须使用 ' ' 来引用字符 '\
'、'$
' 和 '`
'。
(此处,在本例中word
是 heredoc 的分隔符EOT
。)这意味着$?
和$RESULT
被扩展,并且 heredoc 将扩展的结果写入最终输入。您依赖于此行为进一步的剧本。
您可以在最终postinst
文件中看到这一点:
$ curl -sL https://github.com/Epic-Breakfast-Productions/OpenQuarterMaster/releases/download/manager-station%2Bcaptain-1.0.18/open+quarter+master-manager-station+captain_1.0.18_all.deb | dpkg-deb --ctrl-tarfile - | tar -xO ./postinst
#!/bin/bash
set -x
oqm-config -g system.hostname
RESULT="0"
if [ "" -eq 1 ]; then
oqm-config -s system.hostname oqm-dev.local "."
fi
# /usr/share/update-notifier/notify-reboot-required
引用分隔符以防止发生这种情况:
cat <<'EOT' > "$buildDir/$debDir/DEBIAN/postinst"
#!/bin/bash
oqm-config -g system.hostname
RESULT=$?
if [ $RESULT -eq 1 ]; then
oqm-config -s system.hostname $(hostname).local "."
fi
EOT