运行 SQL 时 Bash 中的 `<<-EOSQL` 代码块是啥?

Posted

技术标签:

【中文标题】运行 SQL 时 Bash 中的 `<<-EOSQL` 代码块是啥?【英文标题】:What is the `<<-EOSQL` code block in Bash when running SQL?运行 SQL 时 Bash 中的 `<<-EOSQL` 代码块是什么? 【发布时间】:2016-12-12 12:30:21 【问题描述】:

我需要执行一个包含 SQL 的 bash 脚本,因此我使用脚本将自定义配置添加到 Postgres Docker 容器,根据此处的文档:

https://github.com/docker-library/docs/tree/master/postgres#how-to-extend-this-image

但我不知道EOSQL 是什么意思。这是我从上面的文档中获取的脚本示例:

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
    CREATE USER docker;
    CREATE DATABASE docker;
    GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
    CREATE EXTENSION $MY_EXTENSION;
EOSQL

那么,什么是 EOSQL?我似乎找不到有关此命令或关键字的太多信息。

【问题讨论】:

代码没问题;你确定MY_EXTENSION 在运行这个脚本之前被导出了吗? EOSQL 不是关键字;它只是一个用于标记此处文档边界的任意字符串(SQL 结尾)。 啊,是的,环境变量工作正常。我遇到了另一个错误,我认为这是由于环境变量无法加载引起的。我将我的问题更新为关于 EOSQL 块和 Bash Here 文档,这是我误解的原因。 【参考方案1】:

EOSQL 是Bash Here Document 块的限制字符串。它向 bash 解释器表示文本块的开始和结束。限制字符串可以是块中没有出现的任何文本。

变量替换将在此处文档中正常工作:

#!/usr/bin/env bash
cat <<-EOF
$MY_EXTENSION
EOF

然后使用变量集运行它:

$ MY_EXTENSION=something ./test.sh
something

在 Docker 中,您需要在命令行中的 Dockerfiledocker run -e MY_EXTENSION=something &lt;image&gt; 中使用 ENV MY_EXTENSION=something 来设置环境。

【讨论】:

以上是关于运行 SQL 时 Bash 中的 `<<-EOSQL` 代码块是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 nxlog 的日志中发现错误时运行 bash 脚本

.bat 文件中的错误处理

监控sql运行时剩余时间

在mysql批处理中运行多个sql文件

如何从sqlplus到bash脚本获取SQL查询输出

bash shell 脚本中的“set -o noglob”