我注意到它们之间存在一些区别:
在<<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)
将打印空行.
那么它们之间的区别是什么是合法的记录行为?
从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)