Linux 执行脚本时 source 和 . 和 sh 和 ./ 的区别
一般Linux上执行一个shell脚本,有如下几种方法:
source test.sh
. test.sh
bash test.sh
./test.sh
source 和 .
source和 . 这两个都是shell自带的内建命令,这两个命令是等价的关系。也就是说这两条命令的执行是完全一样的。使用 type source 和 type . 可以看出它们都是内建命令;使用 help source 和 help . 也可以看出这两个命令的作用一模一样。因此,这两个命令是等价的,用哪个都行。
作用:在当前 shell 中执行一个文件中的命令。即不会启动一个新的子 shell 进程。所有在脚本中设置的变量将成为当前Shell的一部分。
sh filename 或 bash filename
sh filename 另起一个子 shell 进程,在子 shell 中执行脚本里面的语句,该子 shell 继承父 shell 的环境变量(但不会继承普通变量,也就是没有被 export 的变量)。
测试 source 和 . 和 sh
test.sh :
#!/bin/bash echo "Print Bash Path:$SHELL" echo $EXPORT_VAR echo $LOCAL_VAR
执行如下:
可以看出,. 和 source 执行结果都是一样的,并且可以打印出当前 shell 中的变量 LOCAL_VAR,而使用 bash test.sh 则不能打印出 LOCAL_VAR,因为 bash test.sh 是另起了一个子 shell 执行的脚本,所以父 shell 中的普通变量不能继承,但是 export 的全局的环境变量是可以继承的。
./filename
./ 是用来执行一切可执行文件的方法,不仅仅可以用来执行shell脚本。需要特别注意的是 ./ 并不等于 . 符号,两者是具有本质区别的。使用 ./ 执行的文件必须是可执行文件,文件必须有 x 权限。
./ 这个符号后面需要跟一个可执行文件的路径,用于定位执行文件的位置,这个路径可以是相对路径。那么如何区分不同的可执行文件呢?对于shell脚本来说,我们会在开头加上:#!/bin/bash
使用 ./ 测试 test.sh,先给 test.sh 可执行的权限,从结果中可以发现,没有打印出普通变量 LOCAL_VAR,说明 ./ 也会另起一个 shell 进行可执行文件的执行。
参考文章
Linux shell执行source和 . 的区别_程序猿Ricky的日常干货-CSDN博客_linux shell source
Linux下source命令详解_在努力!-CSDN博客_linux source