【发布时间】:2015-01-29 18:30:12
【问题描述】:
我创建了一个 *.deb 包,它将一些文件保存到所需的位置,它工作正常。在 postinst 期间,我生成了一个新文件(使用我自己的脚本“mergeconfig”将 2 个文件合并在一起),该文件创建得很好。
但是,在 postinst 的下一行,我尝试创建一个指向这个新文件的符号链接,这没有按预期工作。
我似乎没有得到一个链接,而是得到一个硬拷贝/一个新文件:
$ ls -la /etc/app/conf-enabled/
-rw-r--r-- 1 root root 2600 Dec 1 17:00 enabledconfig
我尝试将代码拉出到它自己的文件中并从 postinst 文件中执行它(在赋予它可执行权限之后)并得到相同的结果。虽然如果我手动运行文件,我会创建一个有效的符号链接:
$ /../../updateEnabledConf
-- Merge this package's server config into app config
Complete
-- Update conf-enabled symlink
$ ls -la /etc/app/conf-enabled/
lrwxrwxrwx 1 root root 42 Dec 1 17:06 enabledconfig -> /etc/app/conf-available/server-app
updateEnableConf 中的代码是:
#!/bin/bash
SERVERNAME="server"
APPNAME="app"
CONFIGNAME="enabledconfig"
ETCAPPDIR="/etc/app"
CONFAVAILABLEDIR="$ETCAPPDIR/conf-available"
CONFENABLEDDIR="$ETCAPPDIR/conf-enabled"
CONFAPPDIR="$ETCAPPDIR/conf-app"
CONFSERVERDIR="$ETCAPPDIR/conf-server"
echo " -- Merge this package's server config into app config"
sudo mergeconfig $CONFAPPDIR/$APPNAME $CONFSERVERDIR/$SERVERNAME $CONFAVAILABLEDIR/$SERVERNAME-$APPMNAME
echo " -- Update conf-enabled symlink"
sudo ln -s -f $CONFAVAILABLEDIR/$SERVERNAME-$APPNAME $CONFENABLEDDIR/$CONFIGNAME
exit 0
我不确定我做错了什么,因为在安装 deb 包期间没有正确创建符号链接,但是当我从 putty 手动运行相同的文件时会这样做。两个用户都有 sudo 访问权限,我正在使用 gdebi 安装包,并且我有其他包以相同的方式创建符号链接而没有问题。 任何帮助都会很棒
更新
经过更多调查,发现符号链接是由 postinst 脚本正确创建的,但是在使用 sed 命令到符号链接的路径之后直接调用了另一个文件:
ENABLEDCONF="/etc/app/conf-enabled/enabledconfig"
sed -i 's#<search>#<replace>#g' $ENABLEDCONF
这似乎也从符号链接指向的文件中获取数据,但用新文件覆盖符号链接。我已更新 sed 行以使用 readlink 命令,这已解决问题:
sed -i 's#<search>#<replace>#g' $(readlink $ENABLEDCONF)
感谢您的帮助
【问题讨论】:
-
如果你
set -x运行它会发生什么?您可以通过set +x重新设置 -
嘿@jmunsch,之前没见过 set -x 和 set +x,快速 google 似乎在调试标志?我是否认为您的意思是添加它:
echo " -- Update conf-enabled symlink"set -xsudo ln -s -f $CONFAVAILABLEDIR/$SERVERNAME-$APPNAME $CONFENABLEDDIR/$CONFIGNAMEset +xexit 0 -
你为什么使用 sudo? postinst (et al) 已经以 root 身份运行。
-
@MartynGough 您也可以编写解决方案作为答案,而不仅仅是作为问题本身的更新......
标签: bash package debian post-install