exec、source以及bash的区别

本文深入探讨了bash shell中source、exec和sh命令的区别,通过实例展示了它们在执行shell script时的不同行为,特别是fork、继承变量和环境变化的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在bash shell中,source、exec以及sh都可以用来执行shell script,但是它们的差别在哪里呢?


sh:父进程会fork一个子进程,shell script在子进程中执行


source:在原进程中执行,不会fork子进程


exec:在原进程中执行,但是同时会终止原进程


注:使用export会把父进程中的变量向子进程中继承,但是反过来却不行,在子进程中,不管环境如果改变,均不会影响父进程


下面用一个例子来讲解

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
CODE:
#!/bin/bash
echo "PID for 2.sh: $"
echo "2.sh get \$A=$A from 1.sh"
A=C
export A
echo "2.sh: \$A is $A"
下面在命令行中去执行

./1.sh fork

可以看到,1.sh是在父进程中执行,2.sh是在子进程中执行的,父进程的PID是5344,而子进程的是5345,当子进程执行完毕后,控制权返回到父进程。同时,在子进程改变环境变量A的值不会影响到父进程。


./1.sh source


由结果可知,1.sh和2.sh都是在同一进程中执行的,PID为5367


./1.sh exec

可知,两个脚本都是在同一进程中执行,但是请注意,使用exec终止了原来的父进程,因此,可以看到

echo "PID for 1.sh after exec/source/fork:$"
echo "1.sh: \$A is $A"
这两个命令没有执行


由这个例子,便大致可了解它们的区别了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值