shell脚本中source和expert的简单理解

一、source命令 
source命令也成为“点命令”,即一个点符号(.),是bash的内部命令。 
source可以执行一个shell脚本文件(.sh文件),例如,source test.sh 。我们知道执行.sh文件还可以有另外两种方式,即,sh test.sh及./test.sh 。那它们之间有什么区别呢?在网上很多博客里你可以看到下面这段解释: 
1.当shell脚本具有可执行权限时,用sh test.sh与./test.sh执行脚本是没有区别得。./test.sh是因为当前目录没有在PATH中,所有”.”是用来表示当前目录的。 
2.sh test.sh重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。 
3.source test.sh:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。 
具体什么意思呢,接下来我通过举例来说明一下: 
我们建一个test.sh文件,其具体内容如下:

#!/usr/bin/env bash

para1=01
1
2
3
我们在终端分别采用./test.sh和source test.sh来执行test.sh文件,并在终端输入echo $para1来对变量para1进行输出,结果分别如下:

./test.sh结果如下: 
 
source test.sh结果如下: 
 
由上述结果可以看出,./test.sh方式执行,变量para1只存活在子shell里,在终端所在的shell中是无效的。而source test.sh方式执行,没有建立新的子shell,它是将test.sh脚本中的命令拉到终端所在shell里进行运行,所以当我们echo $para1时,该变量还是有效的。 
接下来我们再讲另外一个例子,如果已经很明白source功能的下面例子可自行跳过。 
我们建立两个不同的.sh文件,分别为1.sh和2.sh,其内容分别如下所示:

1.sh的内容如下:

#!/usr/bin/env bash

source 2.sh

var_2=$var_1
echo $var_2
1
2
3
4
5
6
2.sh的内容如下:

#!/usr/bin/env bash

var_1=01
1
2
3
然后我们再终端分别执行./1.sh,结果如下: 


从上面结果可以看出,我们在终端运行1.sh文件,1.sh中的echo $var_2 可以有效输出 2.sh中 定义的 var_2 变量,解释如下:我们在终端运行./1.sh时建立了一个新的子shell,这个子shell属于1.sh,而1.sh中有source 2.sh这句命令,所以2.sh中的变量可供1.sh的shell使用。我理解的就是,当前shell使用了source,那么被source的文件中的所有内容就被拉到了当前shell,当前shell可以使用被source的文件中的变量函数等。

二、export命令 
export与source相同的是都可以达到一个.sh文件使用另外一个.sh文件中的变量及函数等的效果。但是export的用法与source不同,同样我们通过举例来说明。 
我们建立两个.sh文件,分别为1.sh和2.sh,它们的具体内容如下:

1.sh的内容如下:

#!/usr/bin/env bash

var_1=01
export var_1

./2.sh
1
2
3
4
5
6
2.sh的内容如下:

#!/usr/bin/env bash

var_2=$var_1
echo $var_2
1
2
3
4
然后,我们在终端运行./1.sh,我们得到的结果如下: 
 
这里我们同样可以在终端看到var_1变量的值01的输出。解释如下:我们在终端运行./1.sh,首先建立1.sh对应的子shell,我们暂且称其为shell1,然后1.sh中我们对var_1进行定义,然后将其用export进行输出,然后执行1.sh中的./2.sh,如此一来,1.sh中的var_1变量便可以输出到2.sh中,所以此时./2.sh使得2.sh中的var_2=$var_1可以拿到1.sh中定义的var_1=01的值。相当于,子shell使用了父shell里面的变量。

以上为个人理解,如有问题欢迎指出。 
另:export还有很多其它用法,此处不进行详细列出。
————————————————
版权声明:本文为CSDN博主「SX的笔记」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SuiXin_123/article/details/81366423

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值