わかりました。リモート サーバー (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番目の間のスペースは重要です。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
。