使用fork形式开启的子进程是父进程的一个副本,因而会手动双向承继父进程的环境,如环境变量、资源权限、内存中的数据、信号等等。并且,父进程未能承继子进程环境。
exec形式
使用exec方法调用其他命令或脚本时linux,系统不会开启子进程,而是使用新的程序替换当前的shell环境shell中执行linux命令,由于当前shell被替换了,所以当exec调用的程序结束后,当前环境会被关掉。
exec执行命令流程图:
里面的图中,通过exec时执行ls命令,一个是使用用echo命令让屏幕回显一个字符串信息,最后一个是cd命令,用于切换目录。并且,第一命令使用exec调用ls,系统使用ls命令替换当前的脚本,整个进程就弄成了一个ls命令shell中执行linux命令,当ls命令结束后进程也就结束了。
下边来瞧瞧事例:
#!/bin/bash
exec ls
echo "test"
cd /shell
这儿有个特例,当exec旁边的参数文件重定向时,不会替换当前的shell环境,脚本后续其他命令也不会遭到任何影响。
source形式
使用source或则“.”来调用外部脚本,不会形成新的进程,承继当前shell环境变量,并且被调用的脚本运行结束后,它拥有的环境变量和申明变量会被当前shell保留,类似将调用脚本的内容复制过来直接执行。执行完毕后原主shell继续运行。
下边来看个简单事例:
tmp.sh
#!/bin/bash
env="Minger"
source.sh
#!/bin/bash
source /tmp/tmp.sh
echo "hi,$env"
ls /
在前面的source.sh脚本中使用source命令加载/tmp/tmp.sh脚本,source命令会在不开启shell情况下,将tmp.sh中的所有命令加载当前shell环境中,类似tmp.sh文件中的所有命令编撰在source.sh文件中的一样。
欢迎关注公众号【程序猿编码】,添加本人微讯号()linux 软件,回复:发放学习资料。或则回复:步入技术交流群。云盘资料有如下: