我正在编写 spec 文件,希望在其中放置脚本来从 init.d 目录运行进程。以下是 SPEC 文件的一部分:
%prep
%{__cat} <<EOF > myapp.run
prog="IMG APP BACKEND"
exec=%{APP_prefix}/bin/myapp.%{_APP}
config=%{APP_prefix}/etc/myapp%{_APP}.xml
. /etc/rc.d/init.d/functions
start() {
if [ $UID -ne 0 || $UID -ne 80 ]; then
echo "User has insufficient privilege."
exit 4
fi
[ -x $exec ] || exit 5
[ -f $config ] || exit 6
echo -n $"Starting $prog: "
daemon $exec $config && success || failure
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
当我打开 myapp.run 时我得到(相同部分):
start() {
if [ 1031 -ne 0 || 1031 -ne 80 ]; then
echo "User has insufficient privilege."
exit 4
fi
[ -x ] || exit 5
[ -f ] || exit 6
echo -n $"Starting : "
daemon && success || failure
retval=0
echo
[ -eq 0 ] && touch
return
}
我做错了什么?为什么变量 UID 是 1031 等等?
谢谢大家的回答
答案1
您正在使用定界符使用<<EOF
。在 'sh'/bash shell 中(与大多数其他编程语言一样),heredoc 中的变量在运行时会展开,与双引号字符串中的方式相同。例如,$UID
展开为运行 spec 文件的用户 ID,$exec
展开为空字符串,因为尚未设置。
$ cat <<EOF
> I am $USER
> EOF
I am grawity
为了避免这种情况,请将限制字符串放在单引号中:<<'EOF'
$ cat <<'EOF'
> I am $USER
> EOF
I am $USER