source 就是让 script 在当前 shell 内执行、而不是产生一个 sub-shell 来执行。由
exec 也是让 script 在同一个行程上执行,但是原有行程则被结束了。
source ./my.script
或: . ./my.script
也就是简而言之:原有行程会否终止,就是 exec 与 source/fork 的最大差异了。
代码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 ;; #另起一个进程来执行 2.sh 执行后继续执行1.shesacecho "PID FOR 1.sh after exec/source/fork :$$"echo "1.sh:/$A is $A"
代码 2.sh
1 #!/bin/bash2 echo "PID for 2.sh:$$"3 echo "2.sh get /$A=$A from 1.sh"4 A=C5 export A6 echo "2.sh: /$A is $A"
修改文件权限:
1 chmod 744 1.sh2 chmod 744 2.sh
测试代码:
$ ./1.sh fork $ ./1.sh source$ ./1.sh exec
结果:
# ./1.sh execPID FOR 1.sh before exec/source/fork:243941.sh:$A is Busing exec,,,,,PID for 2.sh:243942.sh get $A=B from 1.sh2.sh: $A is C# ./1.sh sourcePID FOR 1.sh before exec/source/fork:244411.sh:$A is Busing source....PID for 2.sh:244412.sh get $A=B from 1.sh2.sh: $A is CPID FOR 1.sh after exec/source/fork :244411.sh:$A is C# ./1.sh forkPID FOR 1.sh before exec/source/fork:244721.sh:$A is Busing fork by default....PID for 2.sh:244732.sh get $A=B from 1.sh2.sh: $A is CPID FOR 1.sh after exec/source/fork :244721.sh:$A is B
新闻热点
疑难解答