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

一直对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

结果是空的,上面说过, 这种运行方式是启动一个子shell来运行test.sh,但是变量没有导出(加export),所以无法访问


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

原文出处:https://blog.csdn.net/worldchinalee/article/details/80264686

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章