我想在bash命令下运行,其中doc由进程替换表达式包围。
$cat <(cat <<'xx'
1st line
2nd !!
xx
)
但输出如下。结果表明c-shell风格的历史行编辑命令!! (最后一个命令)被相应的命令输出(即最后一个命令)替换,然后被执行。
$ cat <(cat <<'xx'
> 1st line
> 2nd !!
2nd cat <(cat <<'xx'
1st line
> xx
> )
1st line
2nd cat <(cat <<'xx'
1st line
我的问题是为什么历史行编辑命令!!在heredoc中用最后一个命令替换并在示例中执行?
请注意,在以下2个示例中,内置shell变量$$未进行插值,并且!!在这里纯的命令,而不是被包含在进程替换中的命令是非插值的!
$ cat <(cat <<'xx'
> 1st line
> 2nd $$
> xx
> )
1st line
2nd $$
$ cat <<'xx'
> 1st line
> 2nd !!
> xx
1st line
2nd !!
请提供有关根本原因的深入解释。谢谢!
答案 0 :(得分:0)
此处文件
这种类型的重定向指示shell从当前源读取输入,直到看到只包含分隔符(没有尾随空格)的行。然后,读取到该点的所有行都将用作命令的标准输入。
here-documents的格式为:
<<[-]word
here-document
delimiter
不对字执行参数和变量扩展,命令替换,算术扩展或路径名扩展。 如果引用单词中的任何字符,则分隔符是单词上的引号删除结果,而here-document中的行不会展开。如果单词不加引号,则here-document的所有行受到参数扩展,命令替换和算术扩展的影响,字符序列\被忽略,而\必须用于引用字符\,$和`。