bash历史记录行编辑命令在此处被替换为进程替换

时间:2016-01-18 05:25:55

标签: bash shell

我想在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 !!

请提供有关根本原因的深入解释。谢谢!

1 个答案:

答案 0 :(得分:0)

此处文件

这种类型的重定向指示shell从当前源读取输入,直到看到只包含分隔符(没有尾随空格)的行。然后,读取到该点的所有行都将用作命令的标准输入。

here-documents的格式为:

<<[-]word
        here-document
delimiter

不对字执行参数和变量扩展,命令替换,算术扩展或路径名扩展。 如果引用单词中的任何字符,则分隔符是单词上的引号删除结果,而here-document中的行不会展开。如果单词不加引号,则here-document的所有行受到参数扩展,命令替换和算术扩展的影响,字符序列\被忽略,而\必须用于引用字符\,$和`。