[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 ;;
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

结论

  1. fork使用sub-shell的方式执行子脚本, sub-shell会继承一些父脚本的环境变量且有自己的PID, 在sub-shell中修改这些环境变量不会影响父脚本
  2. source在不会开启sub-shell, 这种方式只是在父脚本的上下文执行子脚本中的语句, 在子脚本中修改环境变量会影响父脚本
  3. exec与source类似, 唯一的不同是, 这种方式会终止父脚本的执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值