首先,我们所执行的任何程序,都是由 父进程 (parent process) 所产生出来的一个 子进程 (child process) ,子进程在结束后,将 返回到父进程 去。此一现像在 Linux 系统中被称为  fork
当子进程被产生的时候,将会从父进程那里获得一定的资源分配、及(更重要的是)继承父进程的环境

*所谓环境变量其实就是那些会传给子进程的变量。
简单而言,"遗传性"就是区分本地变量与环境变量的决定性指标。
然而,从遗传的角度来看,我们也不难发现环境变量的另一个重要特征:
*
环境变量只能从父进程到子进程单向继承。换句话说:在子进程中的环境如何变更,均不会影响父进程的环境。

接下来,再让我们了解一下命令脚本(shell script)的概念。
所谓的shell script讲起来很简单,就是将你平时在shell prompt后所输入的多行command line依序写入一个文件去而已。
其中再加上一些条件判断、互动界面、参数运用、函数调用、等等技巧,得以让script更加"聪明"的执行,但若撇开这些技巧不谈,我们真的可以简单的看成script只不过依次执行预先写好的命令行而已

再结合以上两个概念(process + script),那应该就不难理解如下这句话的意思了:
*
正常来说,当我们执行一个shell script时,其实是先产生一个sub-shell的子进程,然后sub-shell再去产生命令行的子进程。

当你有了 fork 的概念之后,要理解 source 就不难:
source命令或者"."
* 所谓 source 就是让 script 在当前 shell 内执行、而不是产生一个 sub-shell 来执行。
由于所有执行结果均于当前 shell 内完成,若 script 的环境有所改变,当然也会改变当前环境了﹗
因此,只要我们要将原本单独输入的 script 命令行变成 source 命令的参数,就可轻易解决前例提到的问题了。
比方说,原本我们是如此执行   script 的:
./my.script
现在改成这样即可:
source ./my.script
或:
. ./my.script

----exec又与source/fork有何不同呢?
shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令后的其它命令将不再执行。
因此,如果你在一个shell里面,执行exec ls那么,当列出了当前目录后,这个shell就自己退出了,因为这个shell进程已被替换为仅仅执行ls命令的一个进程,执行结束自然也就退出了。
* exec也是让script在同一个进程上执行,但是原有进程则被结束了
也就是简而言之:原有进程会否终止,就是execsource/fork的最大差异了。