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

题外话:刚入职,看代码时看到了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

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

./test.sh结果如下:
image
source test.sh结果如下:
image
由上述结果可以看出,./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

2.sh的内容如下:

#!/usr/bin/env bash

var_1=01

然后我们再终端分别执行./1.sh,结果如下:
image

从上面结果可以看出,我们在终端运行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

2.sh的内容如下:

#!/usr/bin/env bash

var_2=$var_1
echo $var_2

然后,我们在终端运行./1.sh,我们得到的结果如下:
image
这里我们同样可以在终端看到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还有很多其它用法,此处不进行详细列出。

你可能感兴趣的:(shell脚本)