我正试图从内部理解bash是如何工作的,我在理解为什么当我们设置一个不带引号的分隔符并用引号进行扩展时,heredoc的输出会被扩展时遇到了问题。
例如:不带引号的分隔符
bash-3.2$ cat << a
> test
> $SHELL
> a
test
/bin/zsh
带引号的分隔符:
bash-3.2$ cat << 'a'
> test
> $SHELL
> a
test
$SHELL
将heredoc分隔符引用为'a'
、"a"
或a
或任何其他方式会导致heredoc被禁用扩展。对于不希望展开美元符号和其他特殊字符的情况,这是一个有用的功能:例如,当heredoc包含嵌入的shell脚本时。
这种行为在Bash手册中有描述(重点添加(:
3.6.6此处文档
这种类型的重定向指示shell从当前源读取输入,直到看到一行只包含单词(没有尾部空格(。然后,读取到该点的所有行都用作命令的标准输入(或者,如果指定了n,则使用文件描述符n(。
此处文档的格式为:
[n]<<[-]word here-document delimiter
word上不执行参数和变量扩展、命令替换、算术扩展或文件名扩展如果单词的任何部分被引用,分隔符是删除词上的引用的结果,并且此处文档中的行不会展开。如果单词未加引号,则此处文档的所有行都将进行参数扩展、命令替换和算术扩展,字符序列
newline
将被忽略,并且必须用于引用字符
、
$
和`
。如果重定向运算符为
<<-
,则从输入行和包含分隔符的行中剥离所有前导制表符。这允许shell脚本中的文档以自然的方式缩进。