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来运行,第三行是输出结果。如果不清楚再回顾下上文:)


















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值