shell heredocs中<EOF和<'EOF'有什么区别?

rro*_*roh 7 shell sh

我正在为linux构建系统的模块编写一个.spec文件,并遇到了一个小问题,想要分享它.

用于编写脚本文件:

cat <<EOF > /path/to/somewhere/script
#blah blah
EOF
chmod +x script
Run Code Online (Sandbox Code Playgroud)

当脚本在目标上运行时,存在指向脚本位置的错误,因为它在主机系统中.基本上$ 0是错误的.

通过在线查看一些示例代码后更改第一行来修复它:

cat <<'EOF' > /path/to/somewhere/script
#blah blah
EOF
chmod +x script
Run Code Online (Sandbox Code Playgroud)

想知道有什么不同以及第二次让它发挥作用的原因.

rua*_*akh 19

不同之处在于此版本:

<<EOF
...
EOF
Run Code Online (Sandbox Code Playgroud)

...功能大致为双引号字符串,进行参数扩展和命令置换等(具体地,在你的情况下,代替$0与的值$0)在这个版本中,而:

<<'EOF'
...
EOF
Run Code Online (Sandbox Code Playgroud)

...功能大致为单引号内的字符串,并没有这样的扩展被执行.

(参见Bash参考手册中的§3.6.6"Here Documents".)


Jon*_*ler 5

区别在于,本文文档的扩展部分是否会解释本文文档主体中的美元和反引号。

$ XYZ=pqr
$ cat <<EOF
> echo $XYZ
> EOF
echo pqr
$ cat <<'EOF'
> echo $XYZ
> EOF
echo $XYZ
$
Run Code Online (Sandbox Code Playgroud)

您可以使用尝试类似的技巧$(...)