Existe-t-il un moyen simple de substituer / évaluer des variables d’environnement dans un fichier? Comme disons que j'ai un fichier config.xml
qui contient:
<property>
<name>instanceId</name>
<value>$INSTANCE_ID</value>
</property>
<property>
<name>rootPath</name>
<value>/services/$SERVICE_NAME</value>
</property>
...etc. Je veux remplacer $INSTANCE_ID
dans le fichier par la valeur de la INSTANCE_ID
variable d'environnement, $SERVICE_NAME
par la valeur de la variable SERVICE_NAME
env. Je ne saurai pas a priori quels vars d'environnement sont nécessaires (ou plutôt, je ne veux pas avoir à mettre à jour le script si quelqu'un ajoute une nouvelle variable d'environnement au fichier de configuration). Merci!
shell-script
text-processing
scripting
environment-variables
Robert Fraser
la source
la source
Réponses:
Vous pourriez utiliser
envsubst
(une partie degnu gettext
):remplacera les variables d’environnement de votre fichier par la valeur correspondante. Les noms de variable doivent contenir uniquement des caractères alphanumériques ou des caractères de soulignement ASCII, ne pas commencer par un chiffre ni être vide. sinon, une telle référence de variable est ignorée.
Pour ne remplacer que certaines variables d'environnement, reportez-vous à cette question.
la source
^[[:alpha:]_][[:alnum:]_]*$
aux paramètres régionaux POSIX.Ce n'est pas très gentil mais ça marche
Si c'était dans un script shell, cela ressemblerait à:
Modifier, deuxième proposition:
Éditer, pas strictement lié à la question, mais dans le cas de variables lues à partir du fichier:
la source
EOF
, les lignes restantes seront exécutées en tant que commandes par le shell. Nous pourrions changer le séparateur en quelque chose de plus long ou de plus compliqué, mais il existe toujours une possibilité théorique de collision. Et quelqu'un pourrait délibérément créer un fichier avec le séparateur pour exécuter des commandes."; ls ;"
dans le fichier et refaites cetteeval
commande :) C'est à peu près le même problème que pour les attaques par injection SQL. Vous devez être très prudent lors du mélange des données avec le code (et ce qui est des commandes shell sont), sauf si vous êtes vraiment , vraiment sûr que personne ne tente de faire quoi que ce soit à gâcher votre journée.`"; ls ;"`
- le formatage des commentaires a mangé les backticks. Mais en réalité, il devrait être juste`ls`
ici. Le fait est que le contenu du fichier entraîne l'exécution de code arbitraire et que vous ne pouvez rien y faire.Si vous avez Perl (mais pas gettext et
envsubst
), vous pouvez effectuer le remplacement simple avec un court script:J'ai supposé que les noms de variables n'auraient que des lettres majuscules et des traits de soulignement, mais le premier motif devrait être facile à modifier si nécessaire.
$ENV{...}
fait référence à l'environnement que Perl voit.Si vous souhaitez prendre en charge la
${...}
syntaxe ou générer une erreur sur des variables non définies, vous aurez encore du travail à faire. Un proche équivalent degettext
'senvsubst
serait:Bien que j’ai le sentiment que le fait de nourrir de telles variables via l’environnement de processus semble un peu incertain en général: vous ne pouvez pas utiliser de variables arbitraires dans les fichiers (car elles peuvent avoir une signification particulière), et certaines des valeurs pourraient avoir au moins une valeur semi-automatique. données sensibles en eux.
la source
perl -pe 's{\$(\{)?(\w+)(?(1)\})}{$ENV{$2} // $&}ge'
pour ne substituer que les variables définies.Puis-je suggérer mon propre script pour cela?
https://github.com/rydnr/set-square/blob/master/.templates/common-files/process-file.sh
la source
De la même manière que pour la réponse Perl, la substitution de variable d’environnement peut être déléguée à la CLI de PHP. La dépendance à PHP peut être ou ne pas être acceptable en fonction de la pile technologique utilisée.
Vous pouvez aller plus loin et le mettre dans un script réutilisable, par exemple
envsubst
:L'utilisation serait:
la source