我在两个系统上有一个相同的文件,但一个系统运行的是 Debian 8,另一个系统运行的是 11
#!/bin/sh
### BEGIN INIT INFO
# Provides: warner
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
[email protected]
subject="$1"
from=`hostname`@blabla.com
daemail=$(cat <<!
From: $from
To: $to
Subject: $subject
$2
You might want to check this...
!)
echo "$daemail" | /usr/sbin/sendmail -t
现在在一个系统(deb8)上,它可以按预期工作,但在另一个系统上,我收到了一个错误
/etc/init.d/warner: 24: Syntax error: end of file unexpected (expecting ")")
现在,当我将 deb11 脚本上的解释器更改为 /bin/bash 时,它可以正常工作。为什么 /bin/sh 在较新的 Debian 上会抛出此错误?
答案1
我猜想 dash 0.5.7-4 (Debian 8.11) 和 dash 0.5.11-git+20200708... (Debian 11) 之间进行了一些更改,这些更改影响了结束标记和终止子 shell 的方式。我认为,自 Jessie (Debian 8) 之前,Debian 就将 /bin/sh 符号链接到 /bin/dash。
尝试在 '!' 后添加 LF,以将结尾的 ')' 移至下一行。
我从 shellcheck.net 获得此信息
Line 20:
!)
^-- SC1119 (error): Add a linefeed between end token and terminating ')'.