Bien, en lugar de codificar algunas variables de entorno locales que reflejan un servidor remoto (servidor OpenShift), me gustaría hacerlo mediante programación, para que no tengamos que mantener todo actualizado manualmente.
Ahora mismo tengo esto codificado en un archivo:
#!/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
En lugar de codificar, puedo recuperar las variables de entorno "públicas" de OpenShift con este comando:
rhc env list -a <app-name>
que escribe esto en la salida estándar:
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
¿Alguien sabe cómo puedo tomar esa salida estándar y, a su vez, exportar cada una de esas variables?
Supongo que sería así: obtener cada línea y luego colocarla export
delante y luego ejecutarla bash -e "export x"
... ¿el problema es que probablemente se ejecuta en un subshell y no afectaría al shell actual?
La respuesta existente a esta pregunta es buena y no debería perderse.
Respuesta1
Si confía en el resultado de su comando rhc, puede obtenerlo:
. <(rhc env list -a <app-name>)
Esto generará (ejecutará) cada línea que rhc
se produzca.
Tal como está escrito, el código anterior define las variables pero no las exporta. Podríamos solucionarlo, pero el siguiente código es más seguro y realiza la exportación.
El comando fuente, .
espera un archivo como argumento. Para convertir la salida de rhc
en un objeto similar a un archivo, usamossustitución de procesos: <(...)
.
Para estar más seguro, utilice:
while read -r line; do declare -x "$line"; done < <(rhc env list -a <app-name>)
Aquí, utilizamos la sustitución de procesos <(...)
, combinada con la redirección de entrada, <
para que el while
bucle lea la salida de rhc
. El espacio entre el primero y el segundo <
es fundamental: nonoomitirlo.
La -x
opción para declare
decirle a bash queexportarLa variable.
Cambiando de orden
Según el comentario a continuación, el rhc
comando se puede colocar en la línea sobre el while
bucle mediante:
tmpvar=$(rhc env list -a <app-name>)
while read -r line; do declare -x "$line"; done <<<"$tmpvar"
<<<
crea unaquí cadena. En este caso, significa que $tmpvar
se proporciona como entrada al while
bucle.