How can I make environment variables "exported" in a shell script stick around?
Solution 1
You should source your script, with
. ./script
or
source ./script
Solution 2
When you run a script it gets its own shell and its own environment, which disappear again as soon as the script is finished. To keep the environment variables around, source the script into your current shell:
$ source ./a.sh
or equivalently (but a little more portably) use the POSIX dot command:
$ . ./a.sh
Then the definitions will be put into your current shell's environment and be inherited by any programs you launch from it.
To be closer to running a script, . a.sh
will find a.sh by searching the directories in the PATH
environment variable.
There are some subtleties in how these behave, and whether .
and source
are the same (or present at all). . ./a.sh
will definitely behave the same in every POSIX-compatible shell, but source
and .
, and . a.sh
and . ./a.sh
, can vary. For Bash source
and .
are the same in all cases; for zsh source
always checks the current directory first; ksh is essentially similar.
If the script name is given as a path (containing a /
), that path is used directly in all cases. The most portably reliable thing to do is . ./script
or . /path/to/script
.
Solution 3
Just for record.
If you want run script from internet which exports env to system
you can use following format
source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)
For example:
source <(curl -s -L https://example.com/install.sh)
Related videos on Youtube
cwd
Updated on September 18, 2022Comments
-
cwd over 1 year
I have multiple Amazon EC2 accounts and want to quickly be able to switch variables, such as
$EC2_HOME
, using a script.I have have a shell script set up like this:
#!/bin/sh export EC2_HOME=/home/me/.ec2 echo $EC2_HOME
When I run the script I know that
EC2_HOME
is set, but I thought that usingexport
would make the variable stick around after the script completed. It does not, as runningecho $EC_HOME
does not show anything.I know this must be very rudimentary Linux scripting knowledge, but I don't know it. I tried looking for related questions without luck - so my apologies if this is a duplicate.
-
Angel Todorov over 12 yearsthe reason is that your script spawns a new shell process as a child of the current shell. Any environment changes you make in the child process cannot affect the parent. When you use
.
orsource
, you are not spawning a new child process, you are running the commands in the current shell. -
Patryk about 12 years@glennjackman I have a similar problem and I have tried your solution but it logs me off from shell when I do
.
orsource
. Why is this happening ? -
enzotib about 12 years@Patryk: maybe your script has an
exit
statement, so it is not suitable to be sourced. -
enzotib over 9 years@71GA: depending on compilation preferences for
sudo
and depending on configuration settings in/etc/sudoers
you can or cannot preserve your environment when running commands withsudo
. I suggest you to try to source your script, and then runsudo
with-E
option to preserve the environment. If it does not work, I suppose there is very little you can do. -
Wildcard about 8 years@71GA, the factual answer to this is: You can't use
sudo
to run a shell built-in (and it wouldn't make any sense if you could). -
Jiri Fornous about 5 yearsThere could also be problems with script arguments - some scripts rely heavily on
$0
param - which should be the script name, but here it is the shell it self. It can produce some unexpected behavior(dirname $0)
... -
Mark Stewart over 4 yearsLooks dangerous but useful if you trust that script!
-
smac89 about 3 yearsThis will replace the shell with the script. i.e. you loose your shell after running this command