Shell how to set environment variables from .env file

This is what I use:

function load_dotenv(){
  # https://stackoverflow.com/a/66118031/134904
  source <(cat $1 | sed -e '/^#/d;/^\s*$/d' -e "s/'/'\\\''/g" -e "s/=\(.*\)/='\1'/g")
}

set -a
[ -f "test.env" ] && load_dotenv "test.env"
set +a

If you're using direnv, know that it already supports .env files out of the box :)

Add this to your .envrc:

[ -f "test.env" ] && dotenv "test.env"

Docs for direnv's stdlib: https://direnv.net/man/direnv-stdlib.1.html


This will export everything in .env:

export $(xargs <.env)

Edit: this requires the environment values to not have whitespace. If this does not match your use case you can use the solution provided by Charles

Edit2: I recommend adding a function to your profile for this in any case so that you don't have to remember the details of set -a or how xargs works.


If your lines are valid, trusted shell but for the export command

This requires appropriate shell quoting. It's thus appropriate if you would have a line like foo='bar baz', but not if that same line would be written foo=bar baz

set -a # automatically export all variables
source .env
set +a

If your lines are not valid shell

The below reads key/value pairs, and does not expect or honor shell quoting.

while IFS== read -r key value; do
  printf -v "$key" %s "$value" && export "$key"
done <.env

Tags:

Shell