コマンドの標準出力を介してプログラム的に環境変数をエクスポートする

コマンドの標準出力を介してプログラム的に環境変数をエクスポートする

わかりました。リモート サーバー (OpenShift サーバー) をミラーリングするローカル env 変数をハードコーディングする代わりに、すべてを手動で最新の状態に保つ必要がないように、プログラムで実行したいと思います。

現在、私はこれをファイルにハードコードしています:

#!/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

その stdout を取得して、各変数をエクスポートする方法を知っている人はいますか?

各行を取得してexportその前に置いて実行する、という感じになると思いますbash -e "export x"...問題は、おそらくサブシェルで実行され、現在のシェルには影響しないのではないかということです。

この質問に対する既存の回答は適切であり、失われるべきではありません。

答え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>)

<(...)ここでは、プロセス置換と入力リダイレクト を組み合わせて使用​​し、ループが の出力から読み取る<ようにします。最初と2番目の間のスペースは重要です。whilerhc<ない省略します。

オプション-xdeclarebashに輸出変数。

注文の変更

以下のコメントのとおり、rhcコマンドは次のようにしてループの上の行に配置できますwhile

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

<<<作成するここで文字列この場合、 がループ$tmpvarへの入力として提供されることを意味しますwhile

関連情報