Existe-t-il un utilitaire pour lire les variables d'environnement à partir d'un fichier env puis exécuter une commande (plus léger que contremaître)?


16

foreman peut lire des fichiers .env et définir des variables d'environnement à partir du contenu, puis exécuter un programme

par exemple foreman run -e vars.env myprogram

... mais il fait beaucoup d'autres choses (et est principalement concerné par le démarrage des choses en utilisant son format Procfile).

Existe-t-il un outil plus simple (Linux / Unix) qui se concentre uniquement sur la lecture des fichiers .env et l'exécution d'une commande avec le nouvel environnement?

Exemple de fichier d'environnement (depuis http://ddollar.github.io/foreman/#ENVIRONMENT ):

FOO=bar
BAZ=qux

1
Pouvez-vous publier un exemple de fichier .env? Je soupçonne bash .envou je sh .envpeux travailler?
Daniel Widrick

@ IVlint67 J'ai un peu amélioré la question.
wodow

Réponses:


19

Vous pouvez source le fichier d'environnement dans le shell actif et exécuter le programme:

sh -ac ' . ./.env; /usr/local/bin/someprogram'

Le -acommutateur exporte toutes les variables, afin qu'elles soient disponibles pour le programme.


3
bash -ac 'source .env && ./program'
fiatjaf

@fiatjaf Pourquoi utiliseriez-vous bash dans ce cas si le shell POSIX fait le travail et que vous n'avez besoin d'aucune fonctionnalité qui nécessite réellement bash? De plus, bash n'est pas disponible par défaut sur tous les systèmes (par exemple FreeBSD).
Marco

Oh, c'est vrai, c'est logique, je pense que votre chemin est meilleur alors. Je fournissais simplement l'alternative Bash parce que je me sentais plus à l'aise pour l'écrire.
fiatjaf

2

Une autre alternative est envdir:

envdir exécute un autre programme avec un environnement modifié en fonction des fichiers dans un répertoire spécifié.


Ce poste mentionne quelques caractéristiques complémentaires entre envdir, runitet chpst; à savoir la capacité à avoir changé les vars env se reflètent dans l'état du processus en cours d'exécution. Le message concerne le docker, mais il ne se limite pas au docker. blog.ghaering.de/post/docker-as-vm [archive.org: web.archive.org/web/20190321165332/https://blog.ghaering.de/… ]
driftcatcher

2

J'ai essayé source .envet cela a fonctionné comme un charme. Malheureusement, aucune des autres solutions publiées ici n'a fonctionné pour moi.


0

Cela marche:

env $(cat .env | tr "\\n" " ") myprogram

mais évidemment ne vérifie pas l' .envexactitude du format du fichier, ce qu'un programme utilitaire ferait.


1) Le catn'est pas nécessaire, il suffit d'écrire tr "\\n" " " < .env2) Cela casse si des affectations multilignes sont utilisées.
Marco
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.