通过命令的标准输出以编程方式导出环境变量

通过命令的标准输出以编程方式导出环境变量

好吧,我不想对一些镜像远程服务器(OpenShift 服务器)的本地环境变量进行硬编码,而是想以编程方式执行此操作,这样我们就不必手动使所有内容保持最新。

现在我将其硬编码在文件中:

#!/usr/bin/env bash

export OPENSHIFT_MONGODB_DB_USERNAME="admin"
export OPENSHIFT_MONGODB_DB_PASSWORD="xyz"
export OPENSHIFT_MONGODB_DB_HOST="emsa-xyz-2-emsa.cloudapps.nabisco.com"
export OPENSHIFT_MONGODB_DB_PORT=60161

我可以使用以下命令从 OpenShift 检索“公共”环境变量,而不是硬编码:

rhc env list -a <app-name>

将其写入标准输出:

NODE_ENV=jailbreak
NPM_CONFIG_PRODUCTION=true
OPENSHIFT_MONGODB_DB_HOST=emsa-xyz-2-emsa.cloudapps.nabisco.com
OPENSHIFT_MONGODB_DB_PASSWORD=xyz
OPENSHIFT_MONGODB_DB_PORT=60161
OPENSHIFT_MONGODB_DB_USERNAME=admin

有谁知道我如何获取该标准输出,然后导出每个变量?

我认为它会像这样 - 获取每一行,然后放在export它前面,然后运行bash -e "export x"...问题是可能在子 shell 中运行并且不会影响当前 shell?

这个问题现有的答案很好,不应该丢失。

答案1

如果您相信 rhc 命令的输出,您可以直接获取它:

. <(rhc env list -a <app-name>)

这将获取(执行)rhc生成的每一行。

正如所写,上面的代码定义了变量但不导出它们。我们可以解决这个问题,但下面的代码更安全并且可以导出。

源命令.需要一个文件作为参数。要将 的输出转换rhc为类似文件的对象,我们使用流程替代: <(...)

为了更安全,请使用:

while read -r line; do declare -x "$line"; done < <(rhc env list -a <app-name>)

在这里,我们使用进程替换<(...)与输入重定向相结合<,以便while循环从 的输出中读取rhc。第一个和第二个之间的空格<至关重要:不是省略它。

-x告诉declarebash 的选项出口变量。

更改订单

根据下面的注释,rhc可以通过以下方式将该命令放置在while循环上方的行上:

tmpvar=$(rhc env list -a <app-name>)
while read -r line; do declare -x "$line"; done <<<"$tmpvar"

<<<创建一个这里的字符串。在这种情况下,这意味着$tmpvar被提供作为while循环的输入。

相关内容