Есть ли простой способ заменить / оценить переменные среды в файле? Например, у меня есть файл, config.xml
который содержит:
<property>
<name>instanceId</name>
<value>$INSTANCE_ID</value>
</property>
<property>
<name>rootPath</name>
<value>/services/$SERVICE_NAME</value>
</property>
...так далее. Я хочу заменить $INSTANCE_ID
в файле значение INSTANCE_ID
переменной окружения $SERVICE_NAME
значением SERVICE_NAME
env var. Я априори не буду знать, какие переменные среды нужны (или, скорее, я не хочу обновлять скрипт, если кто-то добавляет новую переменную среды в файл конфигурации). Благодарность!
shell-script
text-processing
scripting
environment-variables
Роберт Фрейзер
источник
источник
Ответы:
Вы можете использовать
envsubst
(частьgnu gettext
):заменит переменные окружения в вашем файле их соответствующими значениями. Имена переменных должны состоять исключительно из буквенно-цифровых символов или символов подчеркивания ASCII, не должны начинаться с цифры и быть непустыми; в противном случае такая ссылка на переменную игнорируется.
Чтобы заменить только определенные переменные среды, см. Этот вопрос.
источник
^[[:alpha:]_][[:alnum:]_]*$
с языковым стандартом POSIX.Это не очень хорошо, но это работает
Если бы это было в сценарии оболочки, это было бы похоже на:
Изменить, второе предложение:
Редактировать, не строго связанный с вопросом, но в случае чтения переменных из файла:
источник
EOF
, остальные строки будут выполняться как команды оболочкой. Мы могли бы изменить разделитель на что-то более длинное или более сложное, но теоретическая возможность столкновения все еще существует. И кто-то может сознательно сделать файл с разделителем для выполнения команд."; ls ;"
в файл иeval
повторите эту команду :) Это почти та же проблема, что и при атаках с использованием SQL-инъекций. Вы должны быть очень осторожны, когда смешиваете данные с кодом (и это команды оболочки), если только вы действительно не уверены , что никто не пытается сделать что-то, что испортит ваш день.`"; ls ;"`
- форматирование комментариев сгорело назад . Но на самом деле это должно быть`ls`
здесь. Дело в том, что содержимое файла приводит к выполнению произвольного кода, и вы ничего не можете с этим поделать.Если у вас есть Perl (но не gettext и
envsubst
), вы можете сделать простую замену коротким скриптом:Я предполагал, что имена переменных будут состоять только из заглавных букв и подчеркиваний, но первый шаблон должен легко изменяться по мере необходимости.
$ENV{...}
ссылки на среду, которую видит Perl.Если вы хотите поддержать
${...}
синтаксис или выдать ошибку для неустановленных переменных, вам потребуется дополнительная работа. Близкий эквивалентgettext
«хenvsubst
будет:Хотя я чувствую, что подача таких переменных через среду процесса в целом выглядит немного ненадежно: вы не можете использовать произвольные переменные в файлах (поскольку они могут иметь особое значение), а некоторые значения могут иметь по крайней мере полу конфиденциальные данные в них.
источник
perl -pe 's{\$(\{)?(\w+)(?(1)\})}{$ENV{$2} // $&}ge'
чтобы заменить только переменные, которые определены.Могу ли я предложить свой сценарий для этого?
https://github.com/rydnr/set-square/blob/master/.templates/common-files/process-file.sh
источник
Как и в случае ответа Perl, подстановка переменных среды может быть делегирована в CLI PHP. Зависимость от PHP может быть или не быть приемлемой в зависимости от используемого технического стека.
Вы можете пойти дальше и поместить его в повторно используемый скрипт, например
envsubst
:Использование будет:
источник