export和source关于shell环境变量的设定

如果我们在终端定义一个变量,这个变量并不会在环境中保留。

$ AERO_SON="i'm son"
$ env |grep SON

如我我们想要保留这个变量,需要使用export:

$ export AERO_SON="i'm son"
$ env |grep SON
AERO_SON=i'm son

export

父进程定义的变量只在父进程有效,在子进程中不能使用。我们分别在父子shell中设定父子变量,看是否能相互应引用:
父shell:

# cat dad.sh
AERO_DAD="I'M DAD'"

./son.sh

echo dad.sh AERO_SON IS: $AERO_SON
echo dad.sh AERO_DAD IS: $AERO_DAD

子shell:

#cat son.sh
AERO_SON="I'M SON'"

echo son.sh AERO_SON IS: $AERO_SON
echo son.sh AERO_DAD IS: $AERO_DAD

运行:

$ ./dad.sh
son.sh AERO_SON IS: I'M SON'
son.sh AERO_DAD IS:
dad.sh AERO_SON IS:
dad.sh AERO_DAD IS: I'M DAD'

可以看到,父进程变量在子进程不能被访问,反之亦然。
使用export导出变量:

$ cat dad.sh
export AERO_DAD="I'M DAD'"

./son.sh
echo dad.sh AERO_SON IS: $AERO_SON
echo dad.sh AERO_DAD IS: $AERO_DAD
$ cat son.sh
export  AERO_SON="I'M SON'"

echo son.sh AERO_SON IS: $AERO_SON
echo son.sh AERO_DAD IS: $AERO_DAD

执行:

$ ./dad.sh
son.sh AERO_SON IS: I'M SON'
son.sh AERO_DAD IS: I'M DAD'
dad.sh AERO_SON IS:
dad.sh AERO_DAD IS: I'M DAD'

用export导出变量,可以使父进程变量在子进程用使用。但子进程的变量不能在父进程中使用。

source

source(很多时候用. 符号来代替)并不导出变量,它不创建新进程,而是直接把脚本的内容在当前环境中执行。就相当于将内容直接粘贴到当前环境一样。
如果soucre文本中的变量也有export,那么当前环境中的子进程也能访问到该变量。
因此,如果我们把上述的son.sh用source来执行,该脚本的变量AERO_SON 就会保存在当前环境中。
然后再运行dad.sh,就可以访问到AERO_SON了。

$ . son.sh
son.sh AERO_SON IS: I'M SON'
son.sh AERO_DAD IS:
$ ./dad.sh
son.sh AERO_SON IS: I'M SON'
son.sh AERO_DAD IS: I'M DAD'
dad.sh AERO_SON IS: I'M SON'
dad.sh AERO_DAD IS: I'M DAD'

总结:

  • 子进程变量不能在父进程使用;如果需要,可以通过返回值来保留子进程运行结果;
  • 父进程变量可以通过export 之后给子进程使用;
  • source 不另起进程,直接在当前shell运行,因此export的变量在当前环境source之后,可以一直生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值