19

foreman can read .env files and set environment variables from the contents, and then run a program

e.g. foreman run -e vars.env myprogram

...but it does a lot of other things (and is primarily concerned with starting things using its Procfile format).

Is there a simpler (Linux/Unix) tool that's just focussed on reading .env files and executing a command with the new environment?

Example environment file (from http://ddollar.github.io/foreman/#ENVIRONMENT ):

FOO=bar
BAZ=qux
wodow
  • 590
  • 1
  • 5
  • 18

4 Answers4

22

You can source the environment file in the active shell and run the program:

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

The -a switch exports all variables, so that they are available to the program.

Marco
  • 1,489
  • 11
  • 15
  • 3
    `bash -ac 'source .env && ./program'` – fiatjaf Jan 02 '19 at 14:13
  • 1
    @fiatjaf Why would you use bash in this case if the POSIX shell does the job and you need no feature that actually requires bash? Furthermore, bash is not available by default on all systems (e.g. FreeBSD). – Marco Jan 02 '19 at 19:46
  • 1
    Oh, right, makes sense, I think your way is better, then. I was just providing the Bash alternative because I felt more comfortable writing it. – fiatjaf Jan 03 '19 at 21:03
2

Another alternative is envdir:

envdir runs another program with environment modified according to files in a specified directory.

wodow
  • 590
  • 1
  • 5
  • 18
  • This post mentions some complementary features between `envdir`, `runit`, and `chpst`; namely ability to have changed env vars reflect in the state of the process being run. The post is about docker but it's not limited to docker. https://blog.ghaering.de/post/docker-as-vm/ [ archive.org: https://web.archive.org/web/20190321165332/https://blog.ghaering.de/post/docker-as-vm/ ] – floer_m Mar 21 '19 at 16:53
2

I tried source .env and it worked like a charm. Unfortunately, none of the other solutions posted here worked for me.

Shouvik
  • 21
  • 1
1

This works:

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

but obviously doesn't check the format of the .env file for correctness, which a utility program would do.

wodow
  • 590
  • 1
  • 5
  • 18
  • 1
    1) The `cat` is not necessary, just write `tr "\\n" " " < .env` 2) This breaks if multi-line assignments are used. – Marco Sep 20 '13 at 13:44