您的位置:首页 > 运维架构 > Shell

[exec][source][fork]区别

2017-03-06 17:40 483 查看

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


2.sh

#!/bin/bash
echo "PID for 2.sh: $$"
echo "2.sh get \$A=$A from 1.sh"
A=C
export A
sleep 1
echo "2.sh: \$A is $A"


试验开始

./1.sh fork

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


./1.sh source

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


./1.sh exec

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


结论

fork使用sub-shell的方式执行子脚本, sub-shell会继承一些父脚本的环境变量且有自己的PID, 在sub-shell中修改这些环境变量不会影响父脚本

source在不会开启sub-shell, 这种方式只是在父脚本的上下文执行子脚本中的语句, 在子脚本中修改环境变量会影响父脚本

exec与source类似, 唯一的不同是, 这种方式会终止父脚本的执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell exec fork source 区别