好吧,我不想对一些镜像远程服务器(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
告诉declare
bash 的选项出口变量。
更改订单
根据下面的注释,rhc
可以通过以下方式将该命令放置在while
循环上方的行上:
tmpvar=$(rhc env list -a <app-name>)
while read -r line; do declare -x "$line"; done <<<"$tmpvar"
<<<
创建一个这里的字符串。在这种情况下,这意味着$tmpvar
被提供作为while
循环的输入。