Shell 脚本 - 语法错误:Debian 11 上出现意外文件结尾

Shell 脚本 - 语法错误:Debian 11 上出现意外文件结尾

我在两个系统上有一个相同的文件,但一个系统运行的是 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 ')'.

相关内容