透過命令的標準輸出以程式方式導出環境變數

透過命令的標準輸出以程式方式導出環境變數

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

相關內容