我正在为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
想知道差异是什么以及第二次使它发挥作用的原因。
答案 0 :(得分:16)
不同之处在于此版本:
<<EOF
...
EOF
...
函数大致为双引号字符串,执行参数扩展和命令替换等等(具体而言,在您的情况下,将$0
替换为{{1}的值}),而在这个版本中:
$0
<<'EOF'
...
EOF
函数大致为单引号字符串,并且不执行此类扩展。
答案 1 :(得分:5)
区别在于此处文档正文中的美元和后引号是否被解释为此处文档已展开。
$ XYZ=pqr
$ cat <<EOF
> echo $XYZ
> EOF
echo pqr
$ cat <<'EOF'
> echo $XYZ
> EOF
echo $XYZ
$
您可以使用$(...)
尝试类似的技巧。