source test.sh、sh test.sh、./test.sh有什么区别

source test.sh 、. test.sh、sh test.sh、./test.sh有什么区别

假设当前目录下面有一个可执行文件test.sh(就是chmod +x test.sh之后的文件)使用三种执行方法有什么问题呢?下面给出结论

  1. ./test.shsh test.sh
    两个写法表示的是同一个意思, ./test.sh前面的.是因为当前目录没有在环境变量PATH中,这两个方法都是重新建立一个子shell,然后在子shell中运行脚本test.sh,由于重新创建了子shell,在test.sh中的变量值在当前的shell中也无法找到(因为子shell新建的、改变的变量不会带回到父shell)
  2. 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的进程“中可以使用的变量.

实验

  1. 对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

  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

参考脚本之家的一篇文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值