参考:https://blog.youkuaiyun.com/damontive/article/details/50352722
首先说明两个概念:
父shell与子shell,从shellA中启动一个shell,称之为shellB。 shellA为父shell,shellB为子shell。
最容易理解的情况就是在一个shell中执行一个gnome-terminal命令(不同桌面环境命令不一样),弹出一个新的shell
最常见的情况是在当前shell下执行脚本,这个脚本实际上是在子shell中执行的
bash;"./";".";source运行脚本的区别
source和.等价这个首先我们要知道
echo $PPID #父进程PID
echo $$ #当前进程PID
source命令即点(.)命令,在bash下输入man source,找到source命令解释处,可以看到解释"Read and execute commands from filename in the current shell environment and ..."。
从中可以知道,source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程。
source t.sh
bash和"./"命令都是打开一个子shell来读取并执行FileName中命令。(严格来说./并不算执行程序的命令,只是代表当前路径),子shell执行完毕之后就会回到父shell,不会对父shell产生影响。“ ./ "只能用于拥有执行权限的文件
bash t.sh
该filename文件可以无“执行权限”,当然,配置文件就是影响当前的工作环境,这种情况下用source。
现在有三个脚本
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
结果:
实验2
source exp2.sh
echo $var
bash test.sh
可以看到在当前shell下执行echo $var是没有任何问题的,但是执行bash test.sh时,实验1是没有任何输出(找不到var这个变量)实验2 echo出了var的值。因为实验2中exp2.sh加入了export,所以var变成了环境变量,所以var对子shell是可见的,而实验1中由于没有export var,所以var是个局部变量,并不能被子shell看到
再啰嗦几句, linux中在 etc/profile 或者 ~/.bash_profile或者其他类似的文件中设置环境变量时(比如PATH),如果没有export,那么只能在直接启动的shell中起作用,如果在当前shell下运行脚本或者直接启动一个子shell,因为实际上是局部变量。子shell看不见的,所以就gg了。