shell中的<< EOF和<<\EOF heredocs之间有什么区别?

Jah*_*hid 6 bash shell sh

我注意到它们之间存在一些区别:

<<EOFheredoc中,新值不能分配给变量:

bash <<EOF
s=fds
echo $s
EOF
Run Code Online (Sandbox Code Playgroud)

将打印空行,在哪里

bash <<\EOF
s=fds
echo $s
EOF
Run Code Online (Sandbox Code Playgroud)

将打印变量的值s.

全局变量可以在内部访问<<EOF但不在内部访问<<\EOF(export可以访问内部的变量<<\EOF):

s=fds
bash <<EOF
echo $s
EOF
Run Code Online (Sandbox Code Playgroud)

将打印值fds,在哪里,

s=fds
bash <<\EOF
echo $s
EOF
Run Code Online (Sandbox Code Playgroud)

将打印空行.

那么它们之间的区别是什么是合法的记录行为?

Eta*_*ner 8

POSIX规范:

如果引用单词中的任何字符,则应通过对单词执行引用删除来形成分隔符,并且不应扩展此文档行.否则,分隔符应为单词本身.

所以<<EOF版本有shell 运行这里的doc内容之前扩展所有变量,而<<\EOF(<<'EOF'或者<<EO'F'等等)版本不扩展内容(bash在这种情况下允许这样做).

尝试一下,cat而不是bash更清楚地了解正在发生的事情.

还有printf '[%s]\n' "$s"和/或可能bash -x代替bash:

$ bash -x <<EOF
s=fds
printf '[%s]\n' "$s"
EOF
+ s=fds
+ printf '[%s]\n' ''
[]

$ bash -x <<\EOF
s=fds
printf '[%s]\n' "$s"
EOF
+ s=fds
+ printf '[%s]\n' fds
[fds]
Run Code Online (Sandbox Code Playgroud)