exportar variáveis ​​​​env programaticamente, via stdout do comando

exportar variáveis ​​​​env programaticamente, via stdout do comando

Ok, então, em vez de codificar algumas variáveis ​​de ambiente locais que espelham um servidor remoto (servidor OpenShift), gostaria de fazer isso programaticamente, para que não precisemos manter tudo atualizado manualmente.

No momento, tenho isso codificado em um arquivo:

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

Em vez de codificar, posso recuperar as variáveis ​​de ambiente "públicas" do OpenShift com este comando:

rhc env list -a <app-name>

que escreve isso no stdout:

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

alguém sabe como posso pegar esse stdout e, por sua vez, exportar cada uma dessas variáveis?

Presumo que seria assim - pegue cada linha e coloque-a exportna frente dela e depois execute bash -e "export x"... o problema é que provavelmente é executado em um subshell e não afetaria o shell atual?

A resposta existente a esta pergunta é boa e não deve ser perdida.

Responder1

Se você confia na saída do seu comando rhc, basta obtê-lo:

. <(rhc env list -a <app-name>)

Isso irá originar (executar) cada linha rhcproduzida.

Conforme escrito, o código acima define as variáveis, mas não as exporta. Poderíamos consertar isso, mas o código abaixo é mais seguro e faz a exportação.

O comando source, ., espera um arquivo como argumento. Para converter a saída de rhcem um objeto semelhante a um arquivo, usamossubstituição de processo: <(...).

Para ficar mais seguro, use:

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

Aqui, usamos substituição de processo <(...), combinada com redirecionamento de entrada <, para que o whileloop leia a saída de rhc. O espaço entre o primeiro e o segundo <é essencial: façanãoomita.

A -xopção declarediz ao bash paraexportara variável.

Mudando a ordem

Conforme comentário abaixo, o rhccomando pode ser colocado na linha acima do whileloop via:

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

<<<cria umaqui string. Neste caso, significa que $tmpvaré fornecido como entrada para o whileloop.

informação relacionada