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 export
na 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 rhc
produzida.
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 rhc
em 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 while
loop leia a saída de rhc
. O espaço entre o primeiro e o segundo <
é essencial: façanãoomita.
A -x
opção declare
diz ao bash paraexportara variável.
Mudando a ordem
Conforme comentário abaixo, o rhc
comando 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 umaqui string. Neste caso, significa que $tmpvar
é fornecido como entrada para o while
loop.