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"
修改文件权限:
1 chmod 744 1.sh 2 chmod 744 2.sh
测试代码:
$ ./1.sh fork $ ./1.sh source $ ./1.sh exec
结果:
# ./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