我正在为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".)
区别在于,本文文档的扩展部分是否会解释本文文档主体中的美元和反引号。
$ XYZ=pqr
$ cat <<EOF
> echo $XYZ
> EOF
echo pqr
$ cat <<'EOF'
> echo $XYZ
> EOF
echo $XYZ
$
Run Code Online (Sandbox Code Playgroud)
您可以使用尝试类似的技巧$(...)。