fork,source和exec运行脚本时的差异

来源:互联网 发布:劲霸男装淘宝店 编辑:程序博客网 时间:2024/05/21 11:11
fork
   使用 fork 方式运行 script 时, 就是让 shell(parent process) 产生一个 child process 去执行该 script, 当 child process 结束后, 会返回 parent process,  但 parent process 的环境是不会因 child process 的改变而改变的.
 
source
   使用 source 方式运行 script 时, 就是让 script 在当前 process 内执行, 而不是产生一个 child process 来执行. 由于所有执行结果均于当前 process 内完成, 若 script 的环境有所改变, 当然也会改变当前 process 环境了.
 
exec
   使用 exec 方式运行script时, 它和 source 一样, 也是让 script 在当前process内执行, 但是 process 内的原代码剩下部分将被终止. 同样, process 内的环境随script 改变而改变.

结论:通常如果我们执行时,都是默认为fork的。大家可以通过pstree命令看看关于父子进程的关系。如上,如果想让父进程得到子进程的环境变量,就是source方式了

1.sh的脚本
#!/bin/bashA=Becho "PID for 1.sh before exec/source/fork:$$"export Aecho "1.sh: \$A is $A"case $1 in        exec)                echo "using exec…"                exec ./2.sh ;;        source)                echo "using source…"                . ./2.sh ;;        *)                echo "using fork by default…"                ./2.sh ;;esacecho "PID for 1.sh after exec/source/fork:$$"echo "1.sh: \$A is $A"
2.sh的脚本
#!/bin/bashecho "PID for 2.sh: $$"echo "2.sh get \$A=$A from 1.sh"A=Cexport Aecho "2.sh: \$A is $A"
3. 实验
3.1 fork
PID for 1.sh before exec/source/fork:259921.sh: $A is Busing fork by default…PID for 2.sh: 259932.sh get $A=B from 1.sh2.sh: $A is CPID for 1.sh after exec/source/fork:259921.sh: $A is B
3.2 source
PID for 1.sh before exec/source/fork:259941.sh: $A is Busing source…PID for 2.sh: 259942.sh get $A=B from 1.sh2.sh: $A is CPID for 1.sh after exec/source/fork:259941.sh: $A is C
注意: 三个PID都是25994, 子程序的环境变量被带了出来.
3.3 exec

PID for 1.sh before exec/source/fork:259971.sh: $A is Busing exec…PID for 2.sh: 259972.sh get $A=B from 1.sh2.sh: $A is C
注意: 主程序的剩下部分不执行了.
原创粉丝点击