I have the following project directory structure:
myproj/
.env
setenv.sh
run.sh
Where run.sh looks like:
#!/bin/sh sh setenv.sh echo "$fizz"
Where .env is a properties file of key=value pairs like so:
fizz=buzz foo=bar color=red
The setenv.sh script needs to read the key-value pairs out of .env and export/source them, so that run.sh can reference them at runtime and they will evaluate to whatever their values are in .env.
The run.sh script and setenv.sh scripts need to run on Linux and/or Mac (so where uname is 'Linux', 'FreeBSD' or 'Darwin') and I need to be able to run run.sh over and over, each time with different values in .env, and have them take effect on each run.
Currently my setenv.sh looks like:
#!/bin/sh
unamestr=$(uname)
if [ "$unamestr" = 'Linux' ]; then
export $(grep -v '^#' .env | xargs -d 'n')
elif [ "unamestr" = 'FreeBSD' ] || [ "unamestr" = 'Darwin' ]; then
export $(grep -v '^#' .env | xargs -0)
fi
When I run sh run.sh it echoes the value buzz. But if I change fizz to another value, say, buzz2, and re-run run.sh, it still ouputs the fizz value as being buzz. What can I do so that the values in .env are always dynamically loaded/exported/sourced/etc. on each run of run.sh?
Advertisement
Answer
The issue is when you run sh setenv.sh it starts a new shell session and runs the script there. So, the new session’s environment is configured, not yours.
As @Philippe suggested, you should “source” setenv.sh:
source setenv.sh # this is one way . setenv.sh # this is another way echo "$fizz"
Above code runs the content of setenv.sh in the current session, rather than in another session.