source命令与exec命令都可以用于执行新的shell脚本,那他们有什么区别和注意的地方呢?我们下面通过一个小实验查看两者的区别。
source命令
首先编写子进程shell代码如下:
#!/bin/bash
while :
do
echo "in child proc: $$"
sleep 0.5 #单位:s
done
该shell脚本每0.5秒进行一次打印输出。
下面我们编写父进程脚本如下,使用source命令启动子进程:
#!/bin/bash
source ./child_proc.sh & # &表示后台运行,否则父进程将停止执行
clipid=$! # 获取子进程PID
echo "in father proc: $$"
sleep 3 # 单位:s
kill $clipid # 结束子进程
echo "proc $$: end..."
执行结果如下:
可以看到,父进程与“子进程”的进程ID一样!所以说,source命令实际上并没有开辟新的进程,而是创建了一个线程。
exec命令
将父进程代码中的source命令修改为exec命令,如下
#!/bin/bash
exec ./child_proc.sh & # &表示后台运行,否则父进程将停止执行
clipid=$! # 获取子进程PID
echo "in father proc: $$"
sleep 3 # 单位:s
kill $clipid # 结束子进程
echo "proc $$: end..."
执行结果如下:
可以看到此时子进程与父进程的进程ID不再相同,因此exec命令是开辟了新的进程。
总结
source命令(即 . 命令)是新建线程,而exec命令是创建进程。