Развернуть переменную среды из файла JSON

Вы также можете использовать tmux (, который немного похож на screen ), но я думаю, что его проще использовать.

sudo apt-get install tmux
tmux new -s <session-name>

затем запустите свой скрипт в сеансе нажмите control + b + d, чтобы отсоединить

если вы хотите вернуться к терминалу, просто выполните

tmux a

Преимущество в том, что вы можете легко проверить, если что-то пошло не так, но если вы хотите загрузить много файлов одновременно, может быть проще проверить журнал

4
02.03.2021, 12:30
4 ответа

Вариант 1 :Просто прочитать переменную по имени

bashпозволяет иметь переменные, которые ссылаются на переменные, например:

REF='USER'  # or get it from JSON
echo "${!REF}"
# prints current username

Итак, вы можете написать это:

ENVIRONMENT_REF="$(jq -r '.environment' "properties.json")"
ENVIRONMENT="${!ENVIRONMENT_REF}"

Содержимое JSON:

"environment": "USER"

Вариант 2 :Полное расширение оболочки

Другой вариант, возможно, лучше (, но определенно НЕ безопасный)используетeval:

ENVIRONMENT="$(eval "echo $(jq -r '.environment' "properties.json")")"

Обратите внимание, что это небезопасно и вредоносный код может быть вставлен в файл JSON. Какой вредоносный код? Заглянем в этот properties.jsonфайл:

{
    "environment": "$(rm some_file)" 
}

Оболочка будет evalиспользовать этот код:

echo $(rm some_file)

… и файл с именем some_fileбудет удален. Как видите, в зависимости от введённой туда команды можно нанести очень серьёзный урон.

7
18.03.2021, 22:28

jq обеспечивает доступ к своей среде через $ENVобъект -, аналогичный хэшу Perl $ENVили ассоциативному массиву ENVIRONawk. Например, если предположить, что (соответствует принятому ответу ), ваш файл properties.json выглядит так

{
  "environment": "USER"
}

тогда можно

$ environment="$(jq -r '$ENV[.environment]' properties.json)"
$ echo "$environment"
steeldriver

(лучше избегать ALLCAPS для ваших переменных оболочки ). Если ваш файл выглядит как

{
  "environment": "$USER"
}

включая расширение оболочки -$, то вы можете использовать тот же метод после удаления$:

environment="$(jq -r '$ENV[.environment | sub("^\\$";"")]' properties.json)"

В качестве альтернативы вы можете передать результат простого поиска с помощью внешней envsubstкоманды:

$ environment="$(jq -r '.environment' properties.json | envsubst)"
$ echo "$environment"
steeldriver

См., например, Заменить переменные среды в файле их фактическими значениями?

8
18.03.2021, 22:28

Один из способов может быть следующим

ENVIRONMENT=$(printenv $(jq -r '.environment' properties.json |
cut -c2-))
0
18.03.2021, 22:28

Это всего лишь небольшой пересказ -один из других ответов .

В терминале Linux создайте локальную папку:

$ mkdir -p ~/unix.se/jq/ && cd ~/unix.se/jq/

Создать файлproperties.json:

$ echo '{"environment":"USER"}'>properties.json && cat properties.json
{"environment":"USER"}

Дополнительное примечание -красивое форматирование с помощьюjq:

$ jq '.' properties.json
{
  "environment": "USER"
}

Используйте значение ключа JSON environment, чтобы установить новую переменную среды и показать ее содержимое:1

$ JQ_USER=$(jq -r '$ENV[.environment]' properties.json) && echo $JQ_USER
tedly

Пока все хорошо, но проблема в том, что я лгу. (!)-properties.jsonфайл не выглядит совсем как выше, так как в нем есть доллар знак перед USER, вот так:

$ echo '{"environment":"$USER"}'>properties.json && cat properties.json
{"environment":"$USER"}

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

$ JQ_USER=$(jq -r '$ENV[.environment | sub("\\$";"")]' properties.json)
echo $JQ_USER
tedly

1 Когда я впервые запустил это,Я получил сообщение об ошибке, начинающееся с jq: error: ENV/0 is not defined at <top-level>. Оказывается, для$ENV[]требуется версия 1.6(или более поздняя )из jq.

0
18.03.2021, 22:28

Теги

Похожие вопросы