参考:http://www.cnblogs.com/bkygg/p/5023072.html
1:fork 运行的时候开一个sub_shell 执行调用的脚本,sub_shell执行的时候,parent_shell还在。sub_shell执行完毕后返回parent_shell。sub_shell从parent_shell继承环境变量。但是sub_shell中的变量不会带回parent_shell。在子命令执行完后再执行父命令,子级的环境变量不会影响到父级
2:exec 执行子级的命令后,不再执行父级的后面的命令
3:source 执行子级命令后继续执行父级的命令,同时子级设置的环境变量会影响到父级的环境变量
与fork的区别是不新开一个sub_shell来执行被调用的脚本,而是在同一个shell中执行,所有被调用的脚本中的声明的变量和环境变量,都可以在主脚本中得到使用
例子理解:
1.sh
#!/bin/bash A=B #$$表示当前进程的PID echo "PID for 1.sh before exec/source/fork:$$" export A echo "1.sh: \$A is $A" case $1 in exec) echo "using exec......" exec ./2.sh;; source) echo "using source......" source ./2.sh;; *) echo "using fork by default......" ./2.sh;; esac echo "PID for 1.sh after exec/source/fork:$$" echo "1.sh: \$A is $A" ~
2.sh
#!/bin/bash echo "PID for 2.sh:$$" echo "2.sh get \$A=$A from 1.sh" A=C export A echo "2.sh:\$A is $A"
执行的结果:
[root@lile shell]# ./1.sh fork PID for 1.sh before exec/source/fork:21852 1.sh: $A is B using fork by default...... PID for 2.sh:21853 2.sh get $A=B from 1.sh 2.sh:$A is C PID for 1.sh after exec/source/fork:21852 1.sh: $A is B
[root@lile shell]# ./1.sh source PID for 1.sh before exec/source/fork:21862 1.sh: $A is B using source...... PID for 2.sh:21862 2.sh get $A=B from 1.sh 2.sh:$A is C PID for 1.sh after exec/source/fork:21862 1.sh: $A is C
[root@lile shell]# ./1.sh exec PID for 1.sh before exec/source/fork:21863 1.sh: $A is B using exec...... PID for 2.sh:21863 2.sh get $A=B from 1.sh 2.sh:$A is C