exportar variables ambientales mediante programación, a través de la salida estándar del comando

exportar variables ambientales mediante programación, a través de la salida estándar del comando

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 exportdelante 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 rhcse 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 rhcen 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 whilebucle lea la salida de rhc. El espacio entre el primero y el segundo <es fundamental: nonoomitirlo.

La -xopción para declaredecirle a bash queexportarLa variable.

Cambiando de orden

Según el comentario a continuación, el rhccomando se puede colocar en la línea sobre el whilebucle 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 $tmpvarse proporciona como entrada al whilebucle.

información relacionada