在运行shell脚本时候,有三种方式来调用外部的脚本,exec(execscript.sh)、source(sourcescript.sh)、fork(./script.sh)
1、exec(exec /home/script.sh):
使用exec来调用脚本,被执行的脚本会继承当前shell的环境变量。但事实上exec产生了新的进程,他会把主shell的进程资源占用并替换脚本内容,继承了原主shell的PID号,即原主shell剩下的内容不会执行。
2、source(source /home/script.sh)
使用source或者“.”来调用外部脚本,不会产生新的进程,继承当前shell环境变量,而且被调用的脚本运行结束后,它拥有的环境变量和声明变量会被当前shell保留,类似将调用脚本的内容复制过来直接执行。执行完毕后原主shell继续运行。
3、fork(/home/script.sh)
直接运行脚本,会以当前shell为父进程,产生新的进程,并且继承主脚本的环境变量和声明变量。执行完毕后,主脚本不会保留其环境变量和声明变量。
总结:这样来看fork最灵活,source次之,exec最诡异。
主脚本:1#!/bin/sh
2a=main
3
4echo"ais$a"
5echo"PIDforparentbefore2.sh:$$"
6case$1in
7exec)
8echo"usingexec"
9exec./2.sh;;
10source)
11echo"usingsourcing"
12source./2.sh;;
13*)
14echo"usingfork"
15./2.sh;;
16
17esac
18
19echo"PIDFORparentafter2.sh:$$"
20
21echo"nowmain.shais$a"
22echo"$b"
调用脚本:2.sh1#!/bin/sh
2echo"PIDFOR2.SH:$$"
3
4echo"2.shgetafrommain.shis$a"
5
6a=2.sh
7exporta
8b=3.sh
9
10echo"now2.shais$a"
~
~
执行结果:[root@lvs2home]#./main.shexec
aismain
PIDforparentbefore2.sh:19026
usingexec
PIDFOR2.SH:19026
2.shgetafrommain.shismain
nowais2.sh
[root@lvs2home]#./main.shsource
aismain
PIDforparentbefore2.sh:19027
usingsourcing
PIDFOR2.SH:19027
2.shgetafrommain.shismain
nowais2.sh
PIDFORparentafter2.sh:19027
nowmain.shais2.sh
3.sh
[root@lvs2home]#./main.shfork
aismain
PIDforparentbefore2.sh:19028
usingfork
PIDFOR2.SH:19029
2.shgetafrommain.shismain
nowais2.sh
PIDFORparentafter2.sh:19028
nowmain.shaismain
[root@lvs2home]#