参考:javascript:void(0)
以前一直觉得export可有可无,虽然知道export是干嘛的,不就是把本地变量变成全局变量么(实际中叫环境变量),但是感觉好像没有这货也没影响,今天看了这篇博文,终于恍然大悟。用自己的语言,思维方式重新整理一遍

首先说明两个概念:
父shell与子shell,从shellA中启动一个shell,称之为shellB。 shellA为父shell,shellB为子shell。
最容易理解的情况就是在一个shell中执行一个gnome-terminal命令(不同桌面环境命令不一样),弹出一个新的shell
最常见的情况是在当前shell下执行脚本,这个脚本实际上是在子shell中执行的

概念说完了,感觉啰嗦了, 说实验

这里用最常见的情况举例:在当前shell下执行脚本

现在有三个脚本
exp1.sh

var="hello,world"

exp2.sh

var="hello,world"
export var

test.sh

echo $var

实验1:

source exp1.sh
echo $var
bash test.sh

结果:
linux中export的作用_bash

实验2:

source exp2.sh
echo $var
bash test.sh

结果:
linux中export的作用_bash_02
可以看到在当前shell下执行echo $var是没有任何问题的,但是执行bash test.sh时,实验1是没有任何输出(找不到var这个变量)实验2 echo出了var的值。因为实验2中exp2.sh加入了export,所以var变成了环境变量,所以var对子shell是可见的,而实验1中由于没有export var,所以var是个局部变量,并不能被子shell看到

再啰嗦几句, linux中在 profile 或者 bashrc 或者其他类似的文件中设置环境变量时(比如PATH),如果没有export,那么只能在直接启动的shell中起作用,如果在当前shell下运行脚本或者直接启动一个子shell,因为实际上是局部变量。子shell看不见的,所以就gg了