exporte as variáveis env programaticamente, via stdout do comando [duplicate]

2

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

Neste momento, eu tenho este código embutido 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, eu posso recuperar as variáveis env "públicas" do OpenShift com este comando:

rhc env list -a <app-name>

que grava 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 eu posso pegar esse stdout e, por sua vez, exportar cada uma dessas variáveis?

Eu assumo que seria assim - pegue cada linha e coloque export na frente dele e então execute bash -e "export x" ... o problema é que provavelmente roda em uma subshell e não afetaria o shell atual ?

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

    
por Alexander Mills 23.11.2017 / 01:04

1 resposta

3

Se você tem confiança na saída do seu comando rhc, você pode simplesmente fornecer:

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

Isto irá fornecer (executar) cada linha que rhc produz.

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

O comando de origem, . , espera um arquivo como um argumento. Para converter a saída de rhc em um objeto semelhante a um arquivo, usamos substituição de processo : <(...) .

Para ser mais seguro, use:

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

Aqui, usamos a substituição de processo, <(...) , combinada com o redirecionamento de entrada, < , para que o loop while seja lido na saída de rhc . O espaço entre o primeiro e o segundo < é essencial: do não omita-o.

A opção -x para declare diz ao bash para exportar a variável.

Alterar a ordem

Como comentário abaixo, o comando rhc pode ser colocado na linha acima do while loop via:

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

<<< cria uma string aqui . Nesse caso, significa que o $tmpvar é fornecido como entrada para o loop while .

    
por 23.11.2017 / 01:28