我需要编写脚本以将多行输入输入到程序(psql)。
psql
经过一番谷歌搜索,我发现以下语法有效:
cat << EOF | psql ---params BEGIN; `pg_dump ----something` update table .... statement ...; END; EOF
这样可以正确构造多行字符串(从BEGIN;to到END;inclusive),并将其作为输入传递给psql。
BEGIN;
END;
但是我不知道它如何/为什么起作用,请解释一下吗?
我主要是指cat << EOF,我知道>输出到文件,>>追加到文件,<从文件读取输入。
cat << EOF
>
>>
<
到底<<是做什么的?
<<
并且有手册页吗?
这称为 heredoc 格式,以将字符串提供给stdin。有关更多详细信息,请参见https://en.wikipedia.org/wiki/Here_document#Unix_shells。
来自man bash:
man bash
这里文件 这种重定向指示外壳程序从当前源读取输入,直到看到仅包含单词(无尾随空格)的行。 直到该点为止的所有行都将用作命令的标准输入。 此处文档的格式为: <<[-]word here-document delimiter 没有对 word 执行参数扩展,命令替换,算术扩展或路径名扩展 。如果对 word 中的任何字符加引号,则 定界符 是对 word 删除引号的结果,并且本 文档 中的行不会扩展。如果未引用 word ,则 此文档的 所有行都将 进行参数扩展,命令替换和算术扩展。在后一种情况下,字符序列\<newline>被忽略,\必须使用来引用字符\,$和```。 如果重定向操作符为<<-,则从输入行和包含 定界符 的行中删除所有前导制表 符 。这允许外壳脚本中的此处文档以自然方式缩进。
这种重定向指示外壳程序从当前源读取输入,直到看到仅包含单词(无尾随空格)的行。
直到该点为止的所有行都将用作命令的标准输入。
此处文档的格式为:
<<[-]word here-document delimiter
没有对 word 执行参数扩展,命令替换,算术扩展或路径名扩展 。如果对 word 中的任何字符加引号,则 定界符 是对 word 删除引号的结果,并且本 文档 中的行不会扩展。如果未引用 word ,则 此文档的 所有行都将 进行参数扩展,命令替换和算术扩展。在后一种情况下,字符序列\<newline>被忽略,\必须使用来引用字符\,$和```。
\<newline>
\
$
如果重定向操作符为<<-,则从输入行和包含 定界符 的行中删除所有前导制表 符 。这允许外壳脚本中的此处文档以自然方式缩进。
<<-