Skip to main content
correct handling of PATH in setenv to split on spaces
Source Link

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.

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 with newlines set -gx PATH (echo $argv[2] | tr : \n) else set -gx $argv end end 

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.

Source Link

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 with newlines set -gx PATH (echo $argv[2] | tr : \n) else set -gx $argv end end