一直对shell中export 变量这个概念理解的模模糊糊,今天就来总结下。
在命令行中定义变量很简单,如下:
- [root@zhenglq ~]#VAR=zhenglq
- [root@zhenglq ~]#echo $VAR
- zhenglq
但是这么定义的变量只在该shell中有效,在其它shell或者子shell中都无法访问
例如重新打开一个终端窗口或者重新ssh到这台机器上,echo $VAR 显示的是空的。这也是为什么很多脚本定义变量都用export,如果想让任何shell都有该变量还需要写到开机时运行的脚本中。
export
man export 会找到下面这句
- Names of exported shell variables
在说export之前先解释下shell和子shell的概念,在我们登陆命令行时就相当于系统为我们打开了一个shell,在这个shell上我们还可以运行脚本,跑这个脚本到底是重新启动一个shell来运行还是在目前这个shell运行,取决于我们运行时的命令方式。
例如我们有个test.sh
- #!/bin/sh
- echo $zhenglq1
- [root@zhenglq ~]#sh test.sh
- [root@zhenglq ~]#. ./test.sh
这两种运行方式是不一样的,第一种运行方式是起一个子shell来运行,第二种方式是在当前shell中运行。
回到正题,如果我们不加export 定义变量,那么子shell或其它新shell是无法继承访问的。如果加了export 来定义变量,子shell中是可以访问这个变量的(注意非子shell依然无法访问)。所以定义变量时加export就是让子shell可以访问,因为很多脚本定义变量后会运行其它脚本,或者后续程序需要使用,所以会看到很多脚本中定义变量都是用export
现在该思考那如何让每个打开的shell都有定义该变量怎么弄,例如每次ssh上都不想再定义一遍。这时就需要把 export VAR=zhenglq 写到开机运行的脚本中,因为开机登陆就会运行,并且加了export,所以任何时候都可以使用
概念弄懂了看看简单例子会印象更深
打开终端,定义一个没定义过的变量
- [root@zhenglq ~]#VAR=zhenglq
写个test.sh脚本
- #!/bin/sh . test.sh
- echo $VAR
运行
- [root@zhenglq ~]#sh test.sh
- [root@zhenglq ~]#chmod u+x test.sh
- [root@zhenglq ~]#. ./test.sh
- zhenglq