Согласно 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
. НО также будет оцениваться любая другая встроенная функция оболочки, что создает ОГРОМНЫЙ РИСК БЕЗОПАСНОСТИ .