What's the difference between:
I understand that they both define environment variables, but I don't fully understand the difference.
export propagates the variable to subprocesses.
For example, if you did
then a subprocess that checked for FOO wouldn't find the variable whereas
would allow the subprocess to find it.
FOO has already been defined as an environment variable, then
FOO=bar will modify the value of that environment variable.
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.
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.
Also, if you want to have the variable available to the calling shell without using export you can do this:
File a.ksh is -
On the prompt, run this is
> . a.ksh
This will run the commands within the same shell and $FOO will be available.
Will make $FOO available only within a.ksh, after the call to a.ksh it would not exist.
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.