source test.sh 、. test.sh、sh test.sh、./test.sh有什么区别
假设当前目录下面有一个可执行文件test.sh
(就是chmod +x test.sh之后的文件)使用三种执行方法有什么问题呢?下面给出结论
./test.sh
和sh test.sh
两个写法表示的是同一个意思,./test.sh
前面的.
是因为当前目录没有在环境变量PATH中,这两个方法都是重新建立一个子shell,然后在子shell中运行脚本test.sh,由于重新创建了子shell,在test.sh中的变量值在当前的shell中也无法找到(因为子shell新建的、改变的变量不会带回到父shell)source test.sh
和. test.sh
注意,这里命令. test,sh
和上文说到的./test.sh
差了一个/
,source test.sh
和. test.sh
两个命令也是一样的,source
也叫点命令,也就是说他可以被视为一个.
这个命令的作用就是在当前的shell中运行test.sh,而不是新建一个子shell,也就是说这样的话,test.sh执行结束后test.sh中的一些值在当前的shell也可以看见,所以有些时候当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录;这时就想到用source命令,如:source /etc/profile 或者 . /etc/profile
补充:export和环境变量
export可用于产生环境变量,环境变量的作用就是在“当前shell“、”当前shell的子shell“、”shell和子shell的进程“中可以使用的变量.
实验
- 对source test.sh和sh test.sh的区别
(base) skt1faker@SKT1Faker:~$ cat test.sh
var_export=100
export var_export
var=1
(base) skt1faker@SKT1Faker:~$ sh test.sh
(base) skt1faker@SKT1Faker:~$ echo ${var}
(base) skt1faker@SKT1Faker:~$ echo ${var_export}
(base) skt1faker@SKT1Faker:~$ source test.sh
(base) skt1faker@SKT1Faker:~$ echo "var_export = ${var_export} var = ${var}"
var_export = 100 var = 1
- 观察export的作用(这部分和本文无关是我补充的)
(base) skt1faker@SKT1Faker:~$ . test.sh
(base) skt1faker@SKT1Faker:~$ bash
(base) skt1faker@SKT1Faker:~$ cat test.sh
var_export=100
export var_export
var=1
(base) skt1faker@SKT1Faker:~$ echo ${var} # 注意这里没有显示是因为我运行了bash语句,这样进入了子shell,var没有办法传入子shell,但是环境变量会传入子shell
(base) skt1faker@SKT1Faker:~$ echo ${var_export}
100