source与export

2019-02-24  本文已影响3人  ThomasYoungK

source: 该脚本在当前进程中被执行, 可以用.来替代
export: 定义一个可以被子进程共享的变量

比如我创建一个test1.sh

x=ab

再创建一个test2.sh

export x=ab

再创建一个exect.sh

echo $x

如果我在shell中执行./test1.sh, 再执行echo $x, 我将什么都看不到,因为父进程无法看到子进程中定义的变量。同理,执行./test2.sh,再执行echo $x, 也是什么都看不到。然后执行./exect.sh当然也是什么都没有。

但是如果执行source test1.sh, 再执行echo $x, 输出ab,执行./exect.sh, 什么都不输出。这是因为source的作用等效于在当前进程中执行了x=ab, 但不被子进程看到,因此exect.sh无法得到x的值。
如果执行source test2.sh, 再执行echo $x, 输出ab,执行./exect.sh, 也会输出ab。这是因为x不仅在当前进程中,而且由于export的关系,可以被子进程看到,因此exect.sh也输出了ab

顺便讨论一下.zshrc.bashrc的作用:新打开一个终端,会实现执行类似于source ~/.zshrc的动作,因此.zshrc定义的变量会在终端中可见,这就是echo $PATH能看到我们自定义的PATH的原因。但是如果不export, 那么在子进程中就不能再看到这些定义的变量,而如果在.zshrcexport了变量,则这些变量在后续的新进程中都将始终能被看到。

做个实验验证一下, 在.zshrc的尾部新增2个变量:

...
export xx=10
yy=20

新打开一个终端,发现2个变量都可见:

➜  shell_scripts echo $xx
10
➜  shell_scripts echo $yy
20

再新建一个脚本test3.sh

echo $xx
echo $yy

然后执行该脚本, 发现只打印了xx,没有打印出yy

➜  shell_scripts chmod u+x test3.sh
➜  shell_scripts ./test3.sh
10

因此在.zshrc中的变量需要export来保证所有子进程都可见。

上一篇下一篇

猜你喜欢

热点阅读