"cat << EOF" 在bash中的作用是什么?
"cat << EOF" 在bash中的作用是什么?
我需要编写一个脚本,以输入多行内容到一个程序(psql
)中。
经过一番搜索,我发现下面的语法是可行的:
cat << EOF | psql ---params BEGIN; `pg_dump ----something` update table .... statement ...; END; EOF
这样就可以构建多行字符串(从 BEGIN;
到 END;
,包括两个关键字),并将其作为输入传递给 psql
。
但我不知道它是如何工作的,有人能解释一下吗?
我主要是参考了 cat << EOF
,我知道 >
输出到文件,>>
追加到文件,<
从文件读取输入。
<<
到底是做什么用的?
它有没有手册页面可以查看?
这被称为heredoc格式,提供一个字符串到stdin中。有关更多详情,请参见https://en.wikipedia.org/wiki/Here_document#Unix_shells。
来自man bash
:
Here Documents
这种重定向类型指示shell从当前来源读取输入,直到看到只包含单词(没有尾随空格)的行。
然后,所有在这一点之前读取的行将被用作命令的标准输入。
heredocument的格式如下:
<<[-]word here-document delimiter
没有对word执行参数扩展,命令替换,算术扩展或路径名扩展。如果word中有任何带引号的字符,则分隔符是对word进行引用删除的结果,且here-document中的行未展开。如果word未加引号,则here-document的所有行都将受到参数扩展,命令替换和算术扩展的影响。在后一种情况下,字符序列
\
被忽略,必须使用\
来引用\
,$
和`
字符。如果重定向运算符是
<<-
,则从输入行中剥离所有前导制表符,并包含delimiter的行。这使得shell脚本中的here-documents可以以自然方式缩进。
cat <
cat <语法在Bash中的使用示例:
1. 将多行字符串分配给Shell变量
$ sql=$(cat <
$sql
变量现在也包含了换行符。您可以用echo -e "$sql"
进行验证。2. 在Bash中将多行字符串传递给文件
$ cat <print.sh #!/bin/bash echo \$PWD echo $PWD EOF
print.sh
文件现在包含如下内容:#!/bin/bash echo $PWD echo /home/user
3. 在Bash中将多行字符串传递给管道
$ cat <
b.txt
文件包含bar
和baz
行。相同的输出被打印到stdout
。