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 @   拾月凄辰  阅读(3353)  评论(1编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
历史上的今天:
2019-09-23 idea中HTML格式化时标签缩进问题
点击右上角即可分享
微信分享提示
主题色彩