我正在为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
想知道有什么不同,是什么让它第二次工作。
3条答案
按热度按时间55ooxyrt1#
不同之处在于此版本中:
...
的功能大致相当于一个双引号字符串,执行参数扩展和命令替换等操作(具体来说,在您的示例中,将$0
替换为$0
的值),而在此版本中:...
的功能大致相当于一个单引号字符串,并且不执行此类扩展。(See*Bash参考手册 * 中的§3.6.6“此处记录”。)
6ju8rftf2#
不同之处在于,在展开here文档时,here文档正文中的美元和反引号是否会被解释。
您可以使用
$(...)
尝试类似的技巧。pw136qt23#
EOF
将扩展$
$()
'EOF'
或"EOF"
不会扩展任何内容最需要注意的是,所有的
EOF
'EOF'
"EOF"
都不要扩展*
(除非结果中有
*
,而你不幸的是echo
它)