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还有很多其它用法,此处不进行详细列出。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在shell脚本source命令用于在当前shell环境执行指定的脚本文件。它的作用类似于将指定的脚本文件的命令直接复制到当前shell执行。使用source命令可以避免在shell执行脚本时出现的变量作用域问题,同时也可以使得脚本定义的函数和变量在当前shell生效。使用source命令的语法为:source filename 或 . filename。其,filename为要执行的脚本文件名。 ### 回答2: shell脚本source命令用于在当前bash环境下执行指定文件的命令,而不是新建一个shell执行。在shell脚本使用source命令可以将多个脚本组合成一个脚本运行,或者是将变量、函数等在多个脚本之间共享。 使用source命令执行一个文件的语法如下: source filename 或者 . filename 其"."和"source"命令是等价的,两者都可以执行指定文件的命令。 需要注意的是,如果在执行source命令时指定的文件名包含空格或者其他特殊字符,需要使用单引号或者双引号将文件名括起来。例如: source 'my file.sh' 或者 source "my/file.sh" 使用source命令的情况包括但不限于以下几种: 1. 将多个脚本组合成一个脚本运行。例如,在shell脚本source引入一个配置文件,再source引入一个函数库,最后执行具体任务的命令。 2. 在多个shell脚本之间共享变量、函数等。例如,在一个脚本定义了一个全局变量,可以在其他脚本source脚本,并直接使用该全局变量。 3. 在一个shell脚本使用source命令执行另一个脚本时,可以在执行过程对被执行的脚本进行动态修改,例如添加或删除命令,这样可以使得shell脚本更加灵活、可维护。 在实际使用,需要注意source命令可能会影响当前shell环境的变量、函数等。因此,建议在使用source命令时,确保被执行的脚本不会对当前shell环境造成不可预测的影响。同时,建议对被source脚本进行充分测试,以确保其功能正常、不会与其他脚本产生冲突。 ### 回答3: sourceshell脚本的一个命令,用来在当前shell环境下执行某个脚本文件。它的语法格式为: source filename [arguments] 其,filename是要执行的脚本文件的名字,arguments是传递给脚本的参数(可选)。 与直接执行脚本文件不同的是,source命令不会创建一个新的进程来执行脚本文件,而是直接在当前的shell环境下执行脚本。这意味着,source命令执行完后,脚本定义的变量、函数等都会在当前的shell环境保留下来,并且可以在当前shell继续使用。 source命令的使用场景很多。例如,当我们需要使用外部的配置文件时,可以使用source命令将配置文件加载到当前的shell环境,然后在脚本使用这些配置信息。另外,当我们需要在多个脚本文件共享变量或函数时,也可以使用source命令来实现。 总之,source是一个非常有用的命令,它可以帮助我们在shell脚本更灵活地处理变量、函数、配置文件等信息,并提高shell脚本的可读性、可维护性和复用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值