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
wodow
la source
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.

Marco
la source
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é.

wodow
la source
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.

Shouvik
la source
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.

wodow
la source
1) Le catn'est pas nécessaire, il suffit d'écrire tr "\\n" " " < .env2) Cela casse si des affectations multilignes sont utilisées.
Marco