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

新手上路,请多包涵

我需要编写一个脚本来输入程序的多行输入( psql )。

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

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

`pg_dump ----something`

update table .... statement ...;

END;
EOF

这正确地构造了多行字符串(从 BEGIN;END; ,包括在内)并将其作为输入传递给 psql

但我不知道它是如何/为什么起作用的,有人可以解释一下吗?

I’m referring mainly to cat << EOF , I know > outputs to a file, >> to a file, < reads input from文件。

<< 究竟是做什么的?

是否有它的手册页?

原文由 hasen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 803
2 个回答

这称为 heredoc 格式,用于将字符串提供到标准输入中。有关更多详细信息,请参阅 https://en.wikipedia.org/wiki/Here_document#Unix_shells


man bash

这里的文件

这种类型的重定向指示 shell 从当前源读取输入,直到看到只包含单词(没有尾随空格)的行。

然后将所有读取到该点的行用作命令的标准输入。

这里文档的格式是:

           <<[-]word
                  here-document
          delimiter

不会对 word 执行参数扩展、命令替换、算术扩展或路径名扩展。如果 word 中的任何字符被引用,则 分隔符word 上去除引号的结果,并且 here-document 中的行不展开。如果 word 没有被引用,则 here-document 的所有行都经过参数扩展、命令替换和算术扩展。 In the latter case, the character sequence \<newline> is ignored, and \ must be used to quote the characters \ , $ , and `

如果重定向运算符是 <<- ,则所有前导制表符都将从输入行和包含 delimiter 的行中删除。这允许 shell 脚本中的 here-documents 以自然的方式缩进。

原文由 kennytm 发布,翻译遵循 CC BY-SA 3.0 许可协议

cat <<EOF 语法在 Bash 中处理多行文本时非常有用,例如。将多行字符串分配给 shell 变量、文件或管道时。

cat <<EOF Bash 中的语法用法示例:

1.将多行字符串分配给shell变量

$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)

$sql 变量现在也包含换行符。您可以使用 echo -e "$sql" 进行验证。

2. 将多行字符串传递给 Bash 中的文件

$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF

print.sh 文件现在包含:

 #!/bin/bash
echo $PWD
echo /home/user

3. 将多行字符串传递给 Bash 中的管道

$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF

b.txt 文件包含 barbaz 行。相同的输出打印到 stdout

原文由 Vojtech Vitek 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题