之前也试图多次理解它们的区别,都没理解透彻,今天算是有了更清晰的认识,记录一下。首先理解这几个命令的本质区别前,先要明白进程和子进程的概念。
比如Linux 一个shell命令窗口,就是Linux系统的一个shell进程,如果打开命令窗口就是多个shell进程,每个进程都有自己独立的的环境,比如使用env命令查看到的就是当前窗口进程的环境变量。在这个窗口下通过命令运行起来的程序(比如一些Linux命令,如ls命令或./ext_file 命令,命令即程序),就是该shell窗口进程的子进程,子进程会继承父进程的环境,即继承env环境变量(非export类型的变量不继承)。
为了验证以下结论,先创建一个test.sh文件,编辑如下内容,
#加一个环境变量test,赋值666
export test=666?
#查看一下此时shell进程的环境变量
env
1. source 等价于 . 如 $ source test.sh 等价于? $ . test.sh?
执行这个命令时,并非创建子进程,test.sh内容是在当前的shell进程执行,即会在当前进程生效,执行之后,test.sh中env命令显示的是当前进程进程的环境变量,确实添加了 test=666。
用途:给当前命令窗口进程,添加环境变量,比如Make的编译环境配置,可以通过命令一个一个变量添加,麻烦,一般都写在xxx.sh文件中,通过 source xxx.sh统一添加。
2. ./
执行./test.sh这个命令时(先用unset test删除环境变量),会基于当前窗口shell进程,创建一个子进程,test.sh内容是在子进程中执行并生效,test.sh中的env命令显示的是子进程的环境变量,子进程中确实添加了test=666, 但此时再用命令env查看环境变量(此时是父进程),里边没有test=666变量
用途:运行程序
以上就是source与./的本质区别。
2. sh 、bash命令与./ 一样,都是创建子进程。只不过这两个专用于执行sh脚本,而./命令可用于所有可执行文件(sh、bin文件)
若理解有偏差还望补充指正!!!
参考:Linux 执行脚本时 source 和 . 和 sh 和 ./ 的区别 - 拾月凄辰 - 博客园
|