Global environment variables in a shell script

ShellScriptingEnvironment Variables

Shell Problem Overview


How to set a global environment variable in a bash script?

If I do stuff like

#!/bin/bash
FOO=bar

...or

#!/bin/bash
export FOO=bar

...the vars seem to stay in the local context, whereas I'd like to keep using them after the script has finished executing.

Shell Solutions


Solution 1 - Shell

Run your script with .

. myscript.sh

This will run the script in the current shell environment.

export governs which variables will be available to new processes, so if you say

FOO=1
export BAR=2
./runScript.sh

then $BAR will be available in the environment of runScript.sh, but $FOO will not.

Solution 2 - Shell

When you run a shell script, it's done in a sub-shell so it cannot affect the parent shell's environment. You want to source the script by doing:

. ./setfoo.sh

This executes it in the context of the current shell, not as a sub shell.

From the bash man page:

> . filename [arguments]
> source filename [arguments] > > Read and execute commands from filename in the current shell > environment and return the exit status of the last command executed > from filename. > > If filename does not contain a slash, file names in PATH are used to > find the directory containing filename. > > The file searched for in PATH need not be executable. When bash is not > in POSIX mode, the current directory is searched if no file is found > in PATH. > > If the sourcepath option to the shopt builtin command is turned off, > the PATH is not searched. > > If any arguments are supplied, they become the positional parameters > when filename is executed. > > Otherwise the positional parameters are unchanged. The return status > is the status of the last command exited within the script (0 if no > commands are executed), and false if filename is not found or cannot > be read.

Solution 3 - Shell

source myscript.sh is also feasible.

Description for linux command source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context

Solution 4 - Shell

#!/bin/bash
export FOO=bar

or

#!/bin/bash
FOO=bar
export FOO

man export:

The shell shall give the export attribute to the variables corresponding to the specified names, which shall cause them to be in the environment of subsequently executed commands. If the name of a variable is followed by = word, then the value of that variable shall be set to word.

Solution 5 - Shell

FOO=bar
export FOO

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlexView Question on Stackoverflow
Solution 1 - ShellmobView Answer on Stackoverflow
Solution 2 - ShellpaxdiabloView Answer on Stackoverflow
Solution 3 - ShellCDTView Answer on Stackoverflow
Solution 4 - ShellAndrejs CainikovsView Answer on Stackoverflow
Solution 5 - ShellNikoView Answer on Stackoverflow