一尘不染

bash中的“ cat << EOF”如何工作?

linux

我需要编写脚本以将多行输入输入到程序(psql)。

经过一番谷歌搜索,我发现以下语法有效:

cat << EOF | psql ---params
BEGIN;

`pg_dump ----something`

update table .... statement ...;

END;
EOF

这样可以正确构造多行字符串(从BEGIN;to到END;inclusive),并将其作为输入传递给psql

但是我不知道它如何/为什么起作用,请解释一下吗?

我主要是指cat << EOF,我知道>输出到文件,>>追加到文件,<从文件读取输入。

到底<<是做什么的?

并且有手册页吗?


阅读 307

收藏
2020-06-02

共1个答案

一尘不染

这称为 heredoc
格式,以将字符串提供给stdin。有关更多详细信息,请参见https://en.wikipedia.org/wiki/Here_document#Unix_shells


来自man bash

这里文件

这种重定向指示外壳程序从当前源读取输入,直到看到仅包含单词(无尾随空格)的行。

直到该点为止的所有行都将用作命令的标准输入。

此处文档的格式为:

          <<[-]word
                  here-document
          delimiter

没有对 word 执行参数扩展,命令替换,算术扩展或路径名扩展 。如果对 word 中的任何字符加引号,则 定界符 是对
word 删除引号的结果,并且本 文档 中的行不会扩展。如果未引用 word ,则 此文档的 所有行都将
进行参数扩展,命令替换和算术扩展。在后一种情况下,字符序列\<newline>被忽略,\必须使用来引用字符\$和```。

如果重定向操作符为<<-,则从输入行和包含 定界符 的行中删除所有前导制表 。这允许外壳脚本中的此处文档以自然方式缩进。

2020-06-02