命令替换中的 Heredoc:引号或括号不平衡时出错(bash 和 zsh)

4ae*_*1e1 5 bash shell zsh

考虑以下用于打印单引号的模糊脚本,该脚本适用于ksh

#!/bin/ksh
echo "$(cat <<EOF
'
EOF
)"
Run Code Online (Sandbox Code Playgroud)

输出:

'
Run Code Online (Sandbox Code Playgroud)

bash 3.2.51(1)然而,当我在 OS X 上运行相同的脚本时,

#!/bin/ksh
echo "$(cat <<EOF
'
EOF
)"
Run Code Online (Sandbox Code Playgroud)

bash 报告以下错误:

./heredoc-within-cmdsubst: line 3: unexpected EOF while looking for matching `''
./heredoc-within-cmdsubst: line 6: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

并运行zsh 5.0.2

#!/bin/zsh
echo "$(cat <<EOF
'
EOF
)"
Run Code Online (Sandbox Code Playgroud)

zsh 报告以下错误:

./heredoc-within-cmdsubst:6: unmatched "
Run Code Online (Sandbox Code Playgroud)

当单引号被双引号或括号替换时,也会发生类似的错误。如果我用匹配的单引号/双引号/括号来平衡单引号/双引号/括号,那么脚本在 bash 和 zsh 中都可以正常运行。

这个问题只是 bash 和 zsh(相关版本)中的一个错误,还是这里违反了任何语法规则?

che*_*ner 1

我会认为这是一个解析错误,直到/除非开发人员另有说明。该代码按原样运行,并且问题dash中存在类似的未闭合引用错误。zsh

更新:这实际上在 4.1 中已修复bash;我只签入了zsh5.0.2(最新版本是5.0.6)。