【linux基础】— linux下的source filename.sh及与sh filename.sh、./filename.sh命令的区别

文章目录

  • 一、source命令
  • 二、sh filename.sh与./filename.sh
  • 三、source filename.sh与sh filename.sh及./filename.sh的区别


一、source命令

语法:

source filename.sh
. filename.sh

两种写法的功能一样。

功能:

1、刷新当前的shell环境。
2、当前环境下执行shell脚本。
3、从脚本中导入shell函数到当前环境。
4、从另一个脚本中读取变量

举例1:刷新当前的shell环境。永久添加环境变量(影响当前用户),可以参考 linux 本地变量、环境变量与全局变量解析,修改后,要使用source filename,修改才会生效。

[wqf@b1i10 ~]$ vim ~/.bashrc #打开并修改文件内容

#在文件最后写入以下内容
export PATH="/apps/wqf/model/bin/black_table:$PATH"

[wqf@b1i10 ~]$ source /etc/profile #修改后,要使用source filename,修改才会生效。

举例2:当前环境下执行shell脚本。使用source在当前shell会话中执行它。

[wqf@b1i10 ~]$ vim test.sh

###在文件写入以下内容

#!/bin/bash
a=111
echo $a 

[wqf@b1i10 ~]$ source test.sh

举例3:从脚本中导入shell函数到当前环境。

[wqf@b1i10 ~]$ vim test_func.sh

###在文件写入以下内容

#!/bin/bash
vim test_func(){
echo "hello"
}

[wqf@b1i10 ~]$ source test_func.sh

举例4:从另一个脚本中读取变量。

[wqf@b1i10 ~]$ vim test.sh  ##创建test.sh
###在文件写入以下内容

#!/bin/bash
a=11
b=22
c=33

[wqf@b1i10 ~]$ vim read_test.sh ##创建read_test.sh
###在文件写入以下内容

#!/bin/bash
source ~./test.sh
echo $a,$b,$c

二、sh filename.sh与./filename.sh

语法:

sh filename.sh
./filename.sh

功能:

两者都是打开一个subshell去读取,执行filename.sh,通过在subshell里运行的脚本里设置变量,不会影响到父级shell的。而sh filename.sh不需要有执行权限,./filename.sh需要执行权限

举例:

[wqf@b1i10 ~]$ vim test.sh
###在文件写入以下内容

#!/bin/bash
a=111
echo $a

##使用 sh filename.sh
[wqf@b1i10 ~]$ sh test.sh
111

##使用 ./filename.sh
[wqf@b1i10 ~]$ ./test.sh
-bash: ./test.sh: Permission denied
##用chmod +x添加执行权限
[wqf@b1i10 ~]$ chmod +x test.sh
[wqf@b1i10 ~]$ ./test.sh
111

总结:

当shell脚本有执行权限时,用sh filename.sh与./filename.sh执行脚本是没有区别的,因为当前目录没有在PATH中,所有“.”是用来表示当前目录的。

三、source filename.sh与sh filename.sh及./filename.sh的区别

1、sh filename.sh与./filename.sh重建一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。

2、source filename.sh都是在当前shell里面执行脚本里面的语句,没有建立新的子shell,所以脚本里面所有新建的、改变的变量都会保存在当前shell里面。

举例:

[wqf@b1i10 ~]$ vim test.sh
###在文件写入以下内容

#!/bin/bash
a=111

[wqf@b1i10 ~]$ chmod +x test.sh

[wqf@b1i10 ~]$ ./test.sh
[wqf@b1i10 ~]$ sh test.sh
[wqf@b1i10 ~]$ echo $a  #显示为空,因为a=111并未传回给当前shell

[wqf@b1i10 ~]$ source test.sh
[wqf@b1i10 ~]$ echo $a 会显示1,说明a=111的变量在当前shell中
111

你可能感兴趣的:(#,shell基础知识,shell,linux,运维,服务器)