Итак, вместо того, чтобы жестко кодировать некоторые локальные переменные окружения, которые отражают удаленный сервер (сервер 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нетопустите это.
Параметр -x
to declare
сообщает bash, чтоэкспортпеременная.
Изменение порядка
Согласно комментарию ниже, rhc
команду можно поместить на строку над while
циклом с помощью:
tmpvar=$(rhc env list -a <app-name>)
while read -r line; do declare -x "$line"; done <<<"$tmpvar"
<<<
создаетздесь строка. В данном случае это означает, что $tmpvar
в качестве входных данных для цикла предоставляется while
.