好吧,我不想對一些鏡像遠端伺服器(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
循環的輸入。