envsubst: значения по умолчанию для неустановленных переменных - PullRequest
0 голосов
/ 08 мая 2018

У меня есть файл json input.json, подобный следующему:

{
  "variable" : "${ENV_VAR}"
}

конечно, я могу вызвать envsubst из bash следующим образом:

$ export ENV_VAR=myvalue
$ envsubst < input.json > output.json
$ cat output.json
{
  "variable" : "myvalue"
}

Теперь я хотел бы установить значения по умолчанию для переменных в input.json для случая, когда ENV_VAR не установлен, как в следующем примере, который, как, к сожалению, видно из приведенного ниже примера, не работа:

$ cat input.json
{
  "variable" : "${ENV_VAR:=defaultvalue}"
}
$ export ENV_VAR=newvalue
$ envsubst < input.json > output.json
$ cat output.json
{
  "variable" : "${ENV_VAR:=defaultvalue}"
}
$ unset ENV_VAR
$ envsubst < input.json > output.json
$ cat output.json
{
  "variable" : "${ENV_VAR:=defaultvalue}"
}

Что любопытно, если я выполню envsubst, как в следующем примере (без использования входного файла), он будет работать

$ export ENV_VAR=myvalue
$ echo "value is ${ENV_VAR:=defaultvalue}" | envsubst
value is myvalue
$ unset ENV_VAR
$ echo "value is ${ENV_VAR:=defaultvalue}" | envsubst
value is defaultvalue

Где проблема с файлами?

1 Ответ

0 голосов
/ 09 мая 2018

Согласно man envsubst, envsubst будет заменять только ссылки на переменные среды в виде ${VAR} или $VAR. Специальные функции оболочки, такие как ${VAR:-default}, не поддерживаются. Единственное, что вы можете сделать, это (пере) определить все переменные в среде вызова envsubst и назначить локальные значения по умолчанию, если они отсутствуют:

ENV_VAR="${ENV_VAR:-defaultvalue}" \
OTHER_VAR="${OTHER_VAR:-otherdefault}" \
envsubst < input.json > output.json

Обратите внимание, что на самом деле это одна командная строка, разделенная на несколько строк, каждая из которых заканчивается продолжением строки \. Первые две строки являются присвоениями переменных, которые действуют только в среде выполненной команды envsubstr в последней строке. Происходит то, что оболочка создаст среду для выполнения команды (как это всегда было бы). Эта среда изначально является копией текущей среды оболочки. В этой новой среде ENV_VAR и OTHER_VAR присваиваются значения расширения выражения ${VAR:-default}, которое по существу расширяется до default, если только VAR не определено и не имеет непустого значения. Команда envsubst выполняется, получая файл input.json в качестве стандартного ввода и перенаправляя его стандартный вывод на output.json (оба выполняются оболочкой). После выполнения команды оболочка удаляет командную среду, возвращаясь в исходную среду, т. Е. Назначения локальных переменных больше не действуют.

Невозможно определить значения по умолчанию изнутри файла JSON, если вы не реализуете программу для этого самостоятельно или не используете другой инструмент, который может это сделать.

Вы можете сделать что-то вроде следующего, но это НЕ РЕКОМЕНДУЕТСЯ :

eval echo "$(cat input.json)" > output.json

, который будет читать input.json в строку, а затем eval использовать команду echo <string>, как если бы она была буквально типизированной, что означает, что любой внедренный материал ${VAR:-default} должен быть расширен оболочкой до того, как строка будет передано в echo. НО также будет оцениваться любая другая встроенная функция оболочки, что создает ОГРОМНЫЙ РИСК БЕЗОПАСНОСТИ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...