экспортировать переменные env программно, через stdout команды

экспортировать переменные env программно, через stdout команды

Итак, вместо того, чтобы жестко кодировать некоторые локальные переменные окружения, которые отражают удаленный сервер (сервер OpenShift), я бы хотел сделать это программно, чтобы нам не пришлось вручную обновлять все данные.

Сейчас у меня это жестко закодировано в файле:

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

Вместо жесткого кодирования я могу получить «публичные» переменные окружения из OpenShift с помощью этой команды:

rhc env list -a <app-name>

который выводит это на 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

кто-нибудь знает, как мне взять этот stdout и по очереди экспортировать каждую из этих переменных?

Я предполагаю, что это будет выглядеть так - взять каждую строку, затем вставить exportперед ней и затем запустить bash -e "export x"... Проблема в том, что это, вероятно, выполняется в подоболочке и не повлияет на текущую оболочку?

Существующий ответ на этот вопрос хорош и не должен быть утерян.

решение1

Если вы доверяете результатам работы команды rhc, вы можете просто указать их источник:

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

Это приведет к запуску (выполнению) каждой строки, которая rhcбудет произведена.

Как написано, код выше определяет переменные, но не экспортирует их. Мы могли бы это исправить, но код ниже безопаснее и делает экспорт.

Команда источника, ., ожидает файл в качестве аргумента. Чтобы преобразовать вывод rhcв файлоподобный объект, мы используемзамена процесса: <(...).

Для большей безопасности используйте:

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

Здесь мы используем подстановку процесса, <(...), в сочетании с перенаправлением ввода, <, так что whileцикл считывает вывод rhc. Пространство между первым и вторым <имеет важное значение: doнетопустите это.

Параметр -xto declareсообщает bash, чтоэкспортпеременная.

Изменение порядка

Согласно комментарию ниже, rhcкоманду можно поместить на строку над whileциклом с помощью:

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

<<<создаетздесь строка. В данном случае это означает, что $tmpvarв качестве входных данных для цикла предоставляется while.

Связанный контент