首页 > 学院 > 开发设计 > 正文

[exec][source][fork]区别

2019-11-06 06:33:45
字体:
来源:转载
供稿:网友

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 ;;esacecho "PID for 1.sh after exec/source/fork:$$"echo "1.sh: /$A is $A"

2.sh

#!/bin/bashecho "PID for 2.sh: $$"echo "2.sh get /$A=$A from 1.sh"A=Cexport Asleep 1echo "2.sh: /$A is $A"

试验开始

./1.sh fork

PID for 1.sh before exec/source/fork:259501.sh: $A is Busing fork by default...PID for 2.sh: 259512.sh get $A=B from 1.sh2.sh: $A is CPID for 1.sh after exec/source/fork:259501.sh: $A is B

./1.sh source

PID for 1.sh before exec/source/fork:259651.sh: $A is Busing source...PID for 2.sh: 259652.sh get $A=B from 1.sh2.sh: $A is CPID for 1.sh after exec/source/fork:259651.sh: $A is C

./1.sh exec

PID for 1.sh before exec/source/fork:259791.sh: $A is Busing exec...PID for 2.sh: 259792.sh get $A=B from 1.sh2.sh: $A is C

结论

fork使用sub-shell的方式执行子脚本, sub-shell会继承一些父脚本的环境变量且有自己的PID, 在sub-shell中修改这些环境变量不会影响父脚本source在不会开启sub-shell, 这种方式只是在父脚本的上下文执行子脚本中的语句, 在子脚本中修改环境变量会影响父脚本exec与source类似, 唯一的不同是, 这种方式会终止父脚本的执行
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表