嵌套定界符的奇怪行为

嵌套定界符的奇怪行为

抱歉,如果重复了。不过,我在这里找不到任何类似的问题。我无意中发现了这种奇怪的行为。谁能解释一下这个逻辑吗?为什么解析为“ABC”?

$ cat repro.sh
bash -s <<-EOS1
        bash -s <<EOS2 &
        #ABC
        EOS2
echo "" | wc
#1234567
EOS1

$ . ./repro.sh
      1       0       1
bash: line 5: ABC: command not found
bash: line 6: EOS2: command not found
      1       0       1

答案1

这是 bash 中的一个错误。您应该在以下位置提交错误报告:[电子邮件受保护]

一个更壮观的例子 - 正如您所看到的,它是“来自 stdin 的脚本”、“stdin 作为可查找文件”和“来自后台命令的heredoc”的组合触发它,嵌套heredocs 是不够或必要的:

$ cat a.sh
true <<EOF &
#ABC
EOF
seq 1 3
true | true
#1234567
$ bash <a.sh
1
2
3
bash: line 5: rue: command not found
1
2
3
bash: line 9: rue: command not found
1
...
<same nonsense repeated hundred of times with increasing line numbers>

您可以通过在外部 bash 上“无用”地使用 cat 来绕过它(您的示例中省略了选项卡,因为该站点破坏了它们):

cat <<-EOS1 | bash -s

bash -s <<EOS2 &
#ABC
EOS2

echo "" | wc
#1234567
EOS1

由于脚本将从管道中读取,这将说服 bash 逐字节读取它(每个字节的系统调用),而不是试图通过在输入中来回查找来偷工减料;-)

相关内容