shell heredoc中〈EOF和〈'EOF'有什么区别?

eh57zj3b  于 2023-02-09  发布在  Shell
关注(0)|答案(3)|浏览(222)

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

cat <<EOF > /path/to/somewhere/script
#blah blah
EOF
chmod +x script

当脚本在目标系统上运行时,指向脚本在主机系统中的位置时出现错误。基本上$0是错误的。
在看到一些在线示例代码后,通过如下更改第一行来修复它:

cat <<'EOF' > /path/to/somewhere/script
#blah blah
EOF
chmod +x script

想知道有什么不同,是什么让它第二次工作。

55ooxyrt

55ooxyrt1#

不同之处在于此版本中:

<<EOF
...
EOF

...的功能大致相当于一个双引号字符串,执行参数扩展和命令替换等操作(具体来说,在您的示例中,将$0替换为$0的值),而在此版本中:

<<'EOF'
...
EOF

...的功能大致相当于一个单引号字符串,并且不执行此类扩展。
(See*Bash参考手册 * 中的§3.6.6“此处记录”。)

6ju8rftf

6ju8rftf2#

不同之处在于,在展开here文档时,here文档正文中的美元和反引号是否会被解释。

$ XYZ=pqr
$ cat <<EOF
> echo $XYZ
> EOF
echo pqr
$ cat <<'EOF'
> echo $XYZ
> EOF
echo $XYZ
$

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

pw136qt2

pw136qt23#

EOF将扩展$$()
'EOF'"EOF"不会扩展任何内容
最需要注意的是,所有的EOF'EOF'"EOF"都不要扩展*
(除非结果中有*,而你不幸的是echo它)

相关问题