Difference between "a=b" and "export a=b" in bash
Solution 1
export
propagates the variable to subprocesses.
For example, if you did
FOO=bar
then a subprocess that checked for FOO wouldn't find the variable whereas
export FOO=bar
would allow the subprocess to find it.
But if FOO
has already been defined as an environment variable, then FOO=bar
will modify the value of that environment variable.
For example:
FOO=one # Not an environment variable
export FOO # Now FOO is an environment variable
FOO=two # Update the environment variable, so sub processes will see $FOO = "two"
Older shells didn't support the export FOO=bar
syntax; you had to write FOO=bar; export FOO
.
Solution 2
If you don't use export
, you're not defining an environment variable; just a shell variable.
Shell variables are only available to the shell process; environment variables are available to any subsequent process, not just shells.
Solution 3
Also, if you want to have the variable available to the calling shell without using export you can do this:
File a.ksh is -
#!/bin/ksh
FOO=bar
On the prompt, run this is
> . a.ksh
This will run the commands within the same shell and $FOO will be available.
Whereas,
> a.ksh
Will make $FOO available only within a.ksh, after the call to a.ksh it would not exist.
Solution 4
In addition to what has already been answered, both of these statement do not necessarily define (i.e. create vs set) an environment variable as "a" might already exist as a shell or environment variable.
In the latter case, both statements are strictly equivalent.
Related videos on Youtube
Adam Matan
Team leader, developer, and public speaker. I build end-to-end apps using modern cloud infrastructure, especially serverless tools. My current position is R&D Manager at Corvid by Wix.com, a serverless platform for rapid web app generation. My CV and contact details are available on my Github README.
Updated on September 17, 2022Comments
-
Adam Matan over 1 year
What's the difference between:
a=b
and
export a=b
In bash?
I understand that they both define environment variables, but I don't fully understand the difference.
-
innaM almost 15 yearsCould somebody please edit this? This is not at all related to Linux, but depend only on the shell you are using. I guess it's bash here, which also works on Windows.
-
Adam Matan almost 15 yearsI stand corrected.
-
Stefan Skoglund about 4 yearsexport a=b only means that you get an variabel with the name 'a' and value 'b'.
-
-
wfaulk over 14 yearsActually, if you don't use "
export
", you're not defining an environment variable, but just a shell variable. Shell variables are only available to the shell process; environment variables are available to any subsequent process, not just shells. In addition, subshells are commands contained within parentheses, which do have access to shell variables, whereas what you're talking about are child processes that happen to be shells. -
sleske over 14 yearsCorrect. Note that "." is just a shortcut for "source", which is sometimes used in scripts for better readability. See "help ." or "help source" for details.
-
HDave about 11 yearsWhere are these stored?
-
littleO almost 4 yearsWhat's a "subprocess"? What are some common examples of subprocesses?