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
, 那么在子进程中就不能再看到这些定义的变量,而如果在.zshrc
中export
了变量,则这些变量在后续的新进程中都将始终能被看到。
做个实验验证一下, 在.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
来保证所有子进程都可见。
网友评论