exec 和 source的区别

source 就是让 script 在当前 shell 内执行、而不是产生一个 sub-shell 来执行。由
exec 也是让 script 在同一个行程上执行,但是原有行程则被结束了。

 source ./my.script
 或: . ./my.script
 也就是简而言之:原有行程会否终止,就是 exec 与 source/fork 的最大差异了。

代码1.sh

#!/bin/bash
A=B
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...."
                . ./2.sh ;;  #执行完成后继续执行
        *)
                echo "using fork by default...."
                ./2.sh ;;  #另起一个进程来执行 2.sh 执行后继续执行1.sh
esac

echo "PID FOR 1.sh after exec/source/fork :$$"
echo "1.sh:\$A is $A"

 

代码 2.sh

1 #!/bin/bash
2 echo "PID for 2.sh:$$"
3 echo "2.sh get \$A=$A from 1.sh"
4 A=C
5 export A
6 echo "2.sh: \$A is $A"
View Code

修改文件权限:

1 chmod 744 1.sh
2 chmod 744 2.sh

 

测试代码:

$ ./1.sh fork 
$ ./1.sh source
$ ./1.sh exec
View Code

结果:

# ./1.sh exec
PID FOR 1.sh before exec/source/fork:24394
1.sh:$A is B
using exec,,,,,
PID for 2.sh:24394
2.sh get $A=B from 1.sh
2.sh: $A is C

# ./1.sh source
PID FOR 1.sh before exec/source/fork:24441
1.sh:$A is B
using source....
PID for 2.sh:24441
2.sh get $A=B from 1.sh
2.sh: $A is C
PID FOR 1.sh after exec/source/fork :24441
1.sh:$A is C

# ./1.sh fork
PID FOR 1.sh before exec/source/fork:24472
1.sh:$A is B
using fork by default....
PID for 2.sh:24473
2.sh get $A=B from 1.sh
2.sh: $A is C
PID FOR 1.sh after exec/source/fork :24472
1.sh:$A is B

 

posted @ 2014-02-22 17:08  dragonin  阅读(1247)  评论(0编辑  收藏  举报