当前位置: 首页 > 面试题库 >

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

廖华翰
2023-03-14
问题内容

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

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

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

`pg_dump ----something`

update table .... statement ...;

END;
EOF

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

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

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

到底<<是做什么的?

并且有手册页吗?


问题答案:

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

来自man bash

这里文件

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

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

此处文档的格式为:

          <<[-]word
                  here-document
          delimiter

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

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



 类似资料:
  • Bash Cat With Cat The classic cat command but with a cat. Perfect as an alias. It fallbacks to the original cat if the command is used with pipes.The delimiters adapt to your terminal size. Take a loo

  • 问题内容: 我想使用以下代码将代码打印到文件中: 但是当我检查文件输出时,我得到了: 我试过用单引号引起来,但是输出中也带有单引号。如何避免这个问题? 问题答案: 您只需要进行最小的更改;在此处单引号此处文档分隔符。 或等效的反斜杠转义: 如您发现的一样,如果不引用,此处的文档将进行变量替换,对反引号进行求值等。 如果需要扩展某些而非全部值,则需要逐个转义要避免的值。 将产生 如@fedorqui

  • 问题内容: 我尝试了一些方法来检测代码中的EOF,但仍然无法正常工作。我尝试使用BufferedReader,Scanner和char u001a标记EOF,但对我的代码仍然没有任何意义。这是我的最后一个代码: 该程序应该在到达EOF时停止运行,但是我不知道为什么,由于某些原因,它会继续运行并导致运行时错误。请帮忙。顺便说一句,我是新来的,如果对我的问题还不清楚,很抱歉,谢谢您:) 问题答案: 由

  • 我尝试了一些方法来检测我的代码中的EOF,但它仍然不起作用。我试过使用BufferedReader、Scanner和使用charu001a来标记EOF,但仍然对我的代码没有任何意义。这里是我的最后一段代码: 程序应该在已经到达EOF时停止,但我不知道为什么,由于某些原因,它继续运行并导致运行时错误。请帮帮忙。顺便说一下,我是新来的,如果我的问题不是很清楚,很抱歉不能理解,谢谢你之前:)

  • 问题内容: 我需要循环直到碰到类似文件的对象的末尾,但是我没有找到“明显的方法”,这使我怀疑自己正在忽略某些东西,很明显。:-) 我有一个流(在这种情况下,它是一个StringIO对象,但我也对一般情况感到好奇)以“ ”格式存储未知数量的记录,例如: 现在,我可以想象的唯一清晰的方法就是使用(我认为是)初始化循环,这似乎有点不符合Python风格: 在类似C的语言中,我只是将其保留在的test子句

  • 问题内容: 我想识别Java套接字 中数据流的结尾 。当我运行下面的代码时,它只是卡住并继续运行(它卡在value上)。 我也希望该程序下载二进制文件,但是最后一个字节始终是不同的,因此我不知道如何(实用地)停止 一会儿 。 感谢您的任何提示。 问题答案: 您应该将现有库用于HTTP。看这里。 您的代码按预期工作。服务器不会关闭连接,并且永远不会变为。发生这种情况是因为默认情况下,连接在HTTP