shell中export的作用和点空格运行脚本的意思

一直对shell中export 变量这个概念理解的模模糊糊,今天就来总结下。

在命令行中定义变量很简单,如下:

[plain]  view plain  copy
  1. [root@zhenglq ~]#VAR=zhenglq  
  2. [root@zhenglq ~]#echo $VAR  
  3. zhenglq  

但是这么定义的变量只在该shell中有效,在其它shell或者子shell中都无法访问

例如重新打开一个终端窗口或者重新ssh到这台机器上,echo $VAR 显示的是空的。这也是为什么很多脚本定义变量都用export,如果想让任何shell都有该变量还需要写到开机时运行的脚本中。


export

man export  会找到下面这句

[html]  view plain  copy
  1. Names of exported shell variables  
看了之后,我反正理解不了。

在说export之前先解释下shell和子shell的概念,在我们登陆命令行时就相当于系统为我们打开了一个shell,在这个shell上我们还可以运行脚本,跑这个脚本到底是重新启动一个shell来运行还是在目前这个shell运行,取决于我们运行时的命令方式。

例如我们有个test.sh

[html]  view plain  copy
  1. #!/bin/sh  
  2.   
  3. echo $zhenglq1  


[plain]  view plain  copy
  1. [root@zhenglq ~]#sh test.sh  
  2.   
  3. [root@zhenglq ~]#. ./test.sh  

这两种运行方式是不一样的,第一种运行方式是起一个子shell来运行,第二种方式是在当前shell中运行。


回到正题,如果我们不加export 定义变量,那么子shell或其它新shell是无法继承访问的。如果加了export 来定义变量,子shell中是可以访问这个变量的(注意非子shell依然无法访问)。所以定义变量时加export就是让子shell可以访问,因为很多脚本定义变量后会运行其它脚本,或者后续程序需要使用,所以会看到很多脚本中定义变量都是用export


现在该思考那如何让每个打开的shell都有定义该变量怎么弄,例如每次ssh上都不想再定义一遍。这时就需要把 export VAR=zhenglq  写到开机运行的脚本中,因为开机登陆就会运行,并且加了export,所以任何时候都可以使用


概念弄懂了看看简单例子会印象更深

打开终端,定义一个没定义过的变量

[html]  view plain  copy
  1. [root@zhenglq ~]#VAR=zhenglq  

写个test.sh脚本

[html]  view plain  copy
  1. #!/bin/sh . test.sh  
  2.   
  3. echo $VAR  

运行

[html]  view plain  copy
  1. [root@zhenglq ~]#sh test.sh  
[html]  view plain  copy
  1.   
结果是空的,上面说过, 这种运行方式是启动一个子shell来运行test.sh,但是变量没有导出(加export),所以无法访问


[html]  view plain  copy
  1. [root@zhenglq ~]#chmod u+x test.sh  
  2. [root@zhenglq ~]#.  ./test.sh  
[html]  view plain  copy
  1. zhenglq  
第一句是赋予test.sh拥有者执行权限,第二句是点空格点斜杠test.sh来运行,第三行是输出结果。如果不清楚再回顾下上文:)

猜你喜欢

转载自blog.csdn.net/worldchinalee/article/details/80264686