Existe uma maneira fácil de substituir / avaliar variáveis de ambiente em um arquivo? Como, digamos, eu tenho um arquivo config.xml
que contém:
<property>
<name>instanceId</name>
<value>$INSTANCE_ID</value>
</property>
<property>
<name>rootPath</name>
<value>/services/$SERVICE_NAME</value>
</property>
... etc Desejo substituir $INSTANCE_ID
no arquivo o valor da INSTANCE_ID
variável de ambiente $SERVICE_NAME
pelo valor da SERVICE_NAME
var env. Não vou saber a priori quais vars de ambiente são necessários (ou melhor, não quero atualizar o script se alguém adicionar uma nova variável de ambiente ao arquivo de configuração). Obrigado!
shell-script
text-processing
scripting
environment-variables
Robert Fraser
fonte
fonte
Respostas:
Você pode usar
envsubst
(parte degnu gettext
):substituirá as variáveis de ambiente no seu arquivo pelo valor correspondente. Os nomes das variáveis devem consistir apenas em caracteres ASCII alfanuméricos ou sublinhados, não começar com um dígito e não serem vazios; caso contrário, essa referência variável é ignorada.
Para substituir apenas determinadas variáveis de ambiente, consulte esta pergunta.
fonte
^[[:alpha:]_][[:alnum:]_]*$
ao código do idioma POSIX.Isso não é muito bom, mas funciona
Se estivesse em um script de shell, ficaria assim:
Editar, segunda proposta:
Edite, não estritamente relacionado à pergunta, mas no caso de variáveis lidas do arquivo:
fonte
EOF
, as linhas restantes serão executadas como comandos pelo shell. Poderíamos mudar o separador para algo mais longo ou mais complicado, mas ainda existe uma possibilidade teórica de colisão. E alguém poderia criar deliberadamente um arquivo com o separador para executar comandos."; ls ;"
dentro do arquivo e execute esseeval
comando novamente :) Esse é praticamente o mesmo problema dos ataques de injeção SQL. Você tem que ter muito cuidado ao misturar dados com código (e é isso que comandos shell são), a menos que você é realmente , realmente certeza de que ninguém está a tentar fazer nada para estragar o seu dia.`"; ls ;"`
- a formatação do comentário comia as reticências. Mas, na verdade, esse shoule deve estar`ls`
aqui. O ponto é que o conteúdo do arquivo leva à execução arbitrária de código e não há nada que você possa fazer sobre isso.Se você tiver Perl (mas não gettext e
envsubst
), poderá fazer a substituição simples com um script curto:Supus que os nomes das variáveis tenham apenas letras maiúsculas e sublinhados, mas o primeiro padrão deve ser fácil de alterar conforme necessário.
$ENV{...}
referencia o ambiente que Perl vê.Se você deseja dar suporte à
${...}
sintaxe ou gerar um erro em variáveis não definidas, precisará de mais trabalho. Um equivalente próximo degettext
'senvsubst
seria:Embora eu ache que alimentar variáveis como essa através do ambiente do processo parece um pouco duvidoso em geral: você não pode usar variáveis arbitrárias nos arquivos (pois elas podem ter significados especiais), e alguns dos valores podem ter pelo menos semi- dados sensíveis neles.
fonte
perl -pe 's{\$(\{)?(\w+)(?(1)\})}{$ENV{$2} // $&}ge'
para substituir apenas as variáveis definidas.Posso sugerir meu próprio script para isso?
https://github.com/rydnr/set-square/blob/master/.templates/common-files/process-file.sh
fonte
De maneira semelhante à resposta Perl, a substituição da variável de ambiente pode ser delegada na CLI do PHP. A dependência do PHP pode ou não ser aceitável, dependendo da pilha de tecnologia em uso.
Você pode ir além e colocá-lo em um script reutilizável, por exemplo
envsubst
:O uso seria:
fonte