当子进程被产生的时候,将会从父进程那里获得一定的资源分配、及(更重要的是)继承父进程的环境﹗
*所谓环境变量其实就是那些会传给子进程的变量。
简单而言,"遗传性"就是区分本地变量与环境变量的决定性指标。
简单而言,"遗传性"就是区分本地变量与环境变量的决定性指标。
然而,从遗传的角度来看,我们也不难发现环境变量的另一个重要特征:
*环境变量只能从父进程到子进程单向继承。换句话说:在子进程中的环境如何变更,均不会影响父进程的环境。
*环境变量只能从父进程到子进程单向继承。换句话说:在子进程中的环境如何变更,均不会影响父进程的环境。
接下来,再让我们了解一下命令脚本(shell script)的概念。
所谓的shell script讲起来很简单,就是将你平时在shell prompt后所输入的多行command line依序写入一个文件去而已。
其中再加上一些条件判断、互动界面、参数运用、函数调用、等等技巧,得以让script更加"聪明"的执行,但若撇开这些技巧不谈,我们真的可以简单的看成script只不过依次执行预先写好的命令行而已。
所谓的shell script讲起来很简单,就是将你平时在shell prompt后所输入的多行command line依序写入一个文件去而已。
其中再加上一些条件判断、互动界面、参数运用、函数调用、等等技巧,得以让script更加"聪明"的执行,但若撇开这些技巧不谈,我们真的可以简单的看成script只不过依次执行预先写好的命令行而已。
再结合以上两个概念(process + script),那应该就不难理解如下这句话的意思了:
*正常来说,当我们执行一个shell script时,其实是先产生一个sub-shell的子进程,然后sub-shell再去产生命令行的子进程。
*正常来说,当我们执行一个shell script时,其实是先产生一个sub-shell的子进程,然后sub-shell再去产生命令行的子进程。
当你有了
fork
的概念之后,要理解
source
就不难:
source命令或者"."
source命令或者"."
*
所谓
source
就是让
script
在当前
shell
内执行、而不是产生一个
sub-shell
来执行。
由于所有执行结果均于当前 shell 内完成,若 script 的环境有所改变,当然也会改变当前环境了﹗
因此,只要我们要将原本单独输入的 script 命令行变成 source 命令的参数,就可轻易解决前例提到的问题了。
比方说,原本我们是如此执行 script 的:
./my.script
由于所有执行结果均于当前 shell 内完成,若 script 的环境有所改变,当然也会改变当前环境了﹗
因此,只要我们要将原本单独输入的 script 命令行变成 source 命令的参数,就可轻易解决前例提到的问题了。
比方说,原本我们是如此执行 script 的:
现在改成这样即可:
source ./my.script
或:
. ./my.script
或:
. ./my.script
----那exec又与source/fork有何不同呢?
shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令后的其它命令将不再执行。
因此,如果你在一个shell里面,执行exec ls那么,当列出了当前目录后,这个shell就自己退出了,因为这个shell进程已被替换为仅仅执行ls命令的一个进程,执行结束自然也就退出了。
因此,如果你在一个shell里面,执行exec ls那么,当列出了当前目录后,这个shell就自己退出了,因为这个shell进程已被替换为仅仅执行ls命令的一个进程,执行结束自然也就退出了。
* exec也是让script在同一个进程上执行,但是原有进程则被结束了。
也就是简而言之:原有进程会否终止,就是exec与source/fork的最大差异了。
转载于:https://blog.51cto.com/huoxiubo/787848