安装时,“postinst”中的命令总是导致“$?”=“0”

安装时,“postinst”中的命令总是导致“$?”=“0”

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/releases/tag/manager-station%2Bcaptain-1.0.18

制作 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

相关内容