bash has special syntax for setting environment variables, while fish uses a builtin. I would suggest writing your .env file like so:
setenv VAR1 val1 setenv VAR2 val2 and then defining setenv appropriately in the respective shells. In bash (e.g. .bashrc):
function setenv() { export "$1=$2"; } . ~/.env In fish (e.g. config.fish):
function setenv; set -gx $argv; end source ~/.env Note that PATH will require some special handling, since it's an array in fish but a colon delimited string in bash. If you prefer to write setenv PATH "$HOME/bin:$PATH" in .env, you could write fish's setenv like so:
function setenv if [ $argv[1] = PATH ] # Replace colons and spaces with newlines set -gx PATH (echo $argv[2] | tr ': ' \n) else set -gx $argv end end This will mishandle elements in PATH that contain spaces, colons, or newlines.
The awkwardness in PATH is due to mixing up colon-delimited strings with true arrays. The preferred way to append to PATH in fish is simply set PATH $PATH ~/bin.