Как иметь одно имя экспорта (на основе среды) для нескольких экспортов ключ-значение в zsh?

Я использую zsh и экспортирую свои aws env в файл zshrc, как показано ниже:

export AWS_ACCESS_Development = 1234
export AWS_SECRET_Development = 1234

export AWS_ACCESS_Production = 1234
export AWS_SECRET_Production = 1234

Мне нужно иметь несколько сред, поэтому я могу легко использовать только имя среды вместо всех KEY-SECRET, когда я запускаю команды для разных сред, например:

ENV-1:
export AWS_ACCESS_Development = 1234
export AWS_SECRET_Development = 1234

ENV-2:
export AWS_ACCESS_Development = 1234
export AWS_SECRET_Development = 1234

person Farhad    schedule 05.09.2020    source источник


Ответы (1)


Можно, но синтаксис не совсем красивый.

В общем языке программирования среды должны быть смоделированы как ассоциативный массив, где ключами являются идентификаторы среды (в вашем случае ENV-1, ENV-2), а значения снова представляют собой ассоциативные массивы, где ключом является либо ДОСТУП или СЕКРЕТ, а значение соответствует номеру разработки.

AFIK, Zsh не предоставляет вложенных ассоциативных массивов (по крайней мере, не в версии 5.5.1, которую я использую), но вы можете заменить один из уровней массивов косвенными ссылками на имена переменных.

Предположим, что вы определяете свои среды как ассоциативные массивы.

 declare -A env1 env2
 env1=( [ACCESS]=1234 [SECRET]=2345 )
 env2=( [ACCESS]=3456 [SECRET]=4567 )

Используйте переменную env в качестве общего средства доступа к среде. Если вы знаете, что находитесь в среде 1, установите

 env=env1

Затем вы можете получить доступ к значению SECRET для этого (например) с помощью

 secret_development=${${(P)env}[SECRET]}

где (P) заботится о косвенности. Заманчиво добавить для лучшей читаемости немного пробелов в этом расширенном выражении, но не делайте этого. Выражение станет недействительным.

person user1934428    schedule 07.09.2020