Linux中的export,source,bash

export命令

文末有详细举例说明
export命令用于设置或显示环境变量。
在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。同时,重要的是,export的效力仅仅是该次登录操作。注销或者重新开一个窗口,export命令给出的环境变量都不存在了。
语法
export [-fnp][变量名称]=[变量设置值]
其中:
-f:代表[变量名称]中函数名称。
-n:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p:列出所有的shell赋予程序的环境变量。
你可以只打出export来查看当前的所有环境变量。如果你要在某个环境变量(比如 PATH)中加入一些新的路径(如/bin/bash),可以使用如下命令格式
export PATH=/bin/bash:$PATH
就OK了。

bash命令

像sh,bash,./命令是用来执行shell脚本的,用例如下:

bash filename
sh filename
./filename

这三种形式都是用来打开一个子shell来读取并执行FileName中命令。运行一个shell脚本会启动另一个命令解释器。每个shell脚本有效地运行在父shell(parent shell)的子进程里。这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程。shell脚本也可以启动他自己的子进程。这些子shell(即子进程)使脚本并行地,有效率地同时运行脚本内的多个子任务。略有不同的是:在bash/sh命令下,filename文件可以无“执行权限”,即没有rwx中的x权限。而对于./命令,filename文件必须要有执行权限。

source命令

source filename
.filename

作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无“执行权限”。该命令通常用命令“.”来替代。
source(或点)命令通常用于重新执行刚修改的初始化文档。source命令(从C Shell而来)是bash shell的内置命令。
而点命令,就是个点符号,(从Bourne Shell而来)。
source的程序主体是bash,脚本中的$0变量的值是bash。

export的用法
荔汁一:
简历一个shell脚本var1.sh,其内容为:

cat -n var1.sh
!#/bin/bash
echo :$myvar

然后再终端上执行变量复制语句并用echo显示此变量:

myvar=hello
echo $myvar
hello

但是当执行var1.sh脚本,想显示myvar变量时,情况却并非所愿:
bash ./var1.sh
::
显然,var1.sh并没有看到用户在终端中定义的myvar变量。可见,在终端中设置的变量,在运行的shell脚本中是无法看到的。

荔汁二
建立一个脚本var2.sh,内容为:

cat -n var2.sh
#!/bin/bash
myvar=50
echo :$myvar;

此时,用户在终端设置myvar的值并显示此值,然后再运行var2.sh,看结果:

myvar=100
echo $myvar
100
bash var2.sh
:50:

可见,终端中设置的值,在shell脚本中是无法改变的;而且,终端也无法改变shell脚本里面设置的变量的值。

阶段总结:
在shell工作机制中,存在一个子shell的概念,上面的两个情景展现的就是子shell的形象。子shell是登录shell为了运行某个脚本程序而建立的一个全新的shell,这个全新的shell只会使用自己的局部变量,对父shell(登录shell)的局部变量不屑一顾。而且,子shell和父shell对对方的局部变量都不会有任何冒犯,井水不犯河水。

引子:
有些事情骗骗是需要子shell和父shell有所交互的,这就需要有一个变量是子shell和父shell都能看到和修改的。这时候,export出现了,他可以“导出变量”。
荔汁三:建立一个新的shell脚本var3.sh,内容如下:

cat -n var3.sh
 #!/bin/bash
 echo mylocal=\$mylocal
 echo myglobal=$mylobal

在var3.sh脚本中,设置了两个变量,一个是mylocal,表示局部变量,一个是myglobal,表示全局变量。
在终端上给此变量赋值,然后执行本执var3.sh,很明显,结果是空值:

mylocal=1
myglobal=2
bash var3.sh
mylocal=
myglobal=

针对mylobal执行export来导出变量,再看看结果:

export myglobal
bash var3.sh
mylocal=
myglobal=2

看,脚本程序已经看到了myglobal的值,这里就是export将myglobal导出,真是起到作用了。

阶段总结:

他的内幕:
当使用export来导出一个变量时,当前shell就会将此变量放到“导出变量列表”中,一旦在某个时刻需要建立子shell时,就会将这个导出变量列表拷贝一分给子shell,这样子shell也就有所应当的看到了这些被导出的变量了。

引子:
现在子shell如果想改变这份“导出变量列表”中的某些内容,那么父shell到底能不能察觉呢?父shell会不会随着子shell一起修改这些值呢?

荔汁四:

export myglobal=10
cat -n var4.sh
#!/bin/bash
myglobal=33
echo myglobal=$myglobal
bash var4.sh
myglobal=33
echo $myglobal
10

可见,在子shell是无法改变父shell中的“导出变量列表”中变量的值的。子shell只能修改自己手里的那份“导出变量列表”中变量的值。

阶段总结:
子shell是无法改变父shell中的“导出变量列表”中变量的值的。
变量一旦被导出,对所有后续执行的子shell,该变量都是导出变量。
关于export -p:
可以执行export -p来查看当前shell的导出变量列表。这其中一定是包括了从父shell继承来的导出变量列表。
全文总结:
1.没有导出的局部变量,子shell是看不到的。
2.导出变量列表被复制给子shell,子shell可以修改和存取他,但是这种修改父shell看不到。
3.导出变量列表的上述特性对于直接产生的子shell生效,对于由子shell产生的后继子shell也是如此。
4.export可以在变量赋值之后用,也可以在变量赋值之前用。

export命令的详解

shell与export命令
用户登录到Linux系统后,系统将启动一个用户shell。在这歌shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,他的脚本shell将终止,可以返回到执行该脚本之前的shell。当一个脚本程序运行完毕,他的脚本shell将终止,可以返回到执行该脚本之前的shell。从这种意义上来说,用户可以有许多shell,每个shell都是由某个父shell派生的。
在子shell中定义的变量只在该子shell内有效,如果在一个shell脚本程序中定义了一个变量,其他的shell不能引用他,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。
后续请看https://blog.csdn.net/wangqing_12345/article/details/51853282

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值