Установить переменную среды, определенную строкой? - PullRequest
0 голосов
/ 21 апреля 2020

Я пишу скрипт для копирования переменных конфигурации из службы облачного хранилища в переменные среды (только для локальной разработки, чтобы не делать целую кучу запросов при запуске приложения или тестового сервера). У меня уже есть файл, представляющий собой список имен переменных, разделенных строками.

Я знаю, как установить переменную среды с известным именем:

export SOME_VAR=some_value

Что я не делаю знать, как установить переменную среды с "неизвестным" (во время записи) именем. Поэтому я прочитал в этом файле имена переменных и l oop над списком, запрашивая и exporting каждую переменную.

Итак, главный вопрос: как программно установить переменную среды, имя существует только в строке во время выполнения?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Ваш скрипт на самом деле не должен работать с cat | while, потому что в этом случае while будет выполняться в дочернем процессе, а любой набор или экспорт будет влиять только на дочерний процесс. После завершения l oop все переменные будут потеряны.

Попробуйте это:

#! /usr/bin/env bash
while IFS= read -r line; do
  export $(echo ${line^^})=$(get_value_from_secret_store "$line")
done < list_of_vars_file.txt
0 голосов
/ 21 апреля 2020

Я понял!

Если у вас есть значение, которое вы хотите в $value, и имя переменной env, которую вы хотите установить в $name, вы можете сделать это:

export "$name"="$value"

Бонусный совет:

Мне также нужно было прописать имена переменных, что можно сделать с помощью:

up_name="$(echo "$name" | tr '[:lower:]' '[:upper:]'"

Так что мой последний скрипт закончился так:

#! /usr/bin/env bash

cat < list_of_vars_file.txt | while IFS= read -r line; do
  value="$(get_value_from_secret_store "$line")"
  up_name="$(echo "$line" | tr '[:lower:]' '[:upper:]')"

  export "$up_name"="$value"
done
``

So the env vars can be copied from the secret store (e.g. vault) to the current shell's environment by sourcing that script (After the correct secret retrieval command is swapped in, of course)
...