如果我们在终端定义一个变量,这个变量并不会在环境中保留。
$ 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之后,可以一直生效。