Loading

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

 

posted @ 2021-09-23 10:18  拾月凄辰  阅读(3158)  评论(1编辑  收藏  举报