linux 环境变量归类和配置
linux系统环境分类
在linux操作新系统中,环境变量概括分为两种:系统环境变量,shell环境; 也许这里把环境变量该叫成环境应该更好些,系统环境,shell环境;而环境变量则是将变量存放在系统环境或shell环境中的变量的简称;
系统启动过程中将会加载/etc/profile这个配置文件(如果你的文件系统中有这个文件),这个文件可以配置环境变量,且发生在用户登录之前,这样以来不管任何用户登录,都能够拿到从这个文件中定义的环境变量,这里我把该操作称之为将变量添加如系统环境中;
在系统加载完成相关配置文件之后,最后一步一定是运行login等待用户登录;系统停在login:username这一步;这里系统就要停下来等用户来输入用户认证来登入了;当我们使用本地用户登入了系统,系统将会从/etc/passwd文件中读取该用户口令认证是否正确,如果正确将会启一个该用户的shell解析终端;当该用户shell解析终端启动过程中将会从固定位置(用户家目录)中读取该用户shell配置文件;
用户shell配置文件:
~/.bash_profile :用户第一次登陆将会加载,一般用户登录修改该文件之后,需要注销,重新登陆之后,配置才会生效;
~/.bashrc:用户启动一个shell终端将会执行一次;
当shell终端启动之后,这时候的环境从系统环境转被称为shell环境;shell环境将会继承系统环境中的变量,之后该shell中同样能够访问系统环境中的变量;
linux 环境变量配置
用户想要交互到环境变量,想必是登入到系统中,这时候用户拿到的环境就是shell环境,该环境是唯一的,且伴随着用户本次登陆的一切操作,直到用户登出,该shell资源才会被回收;我们可以使用set来看看当前环境中的变量有哪些,同时我们也可以新建一些环境变量;在当前shell终端中执行:name=word格式指令,将会创建一个名叫name的变量,值为word;将这个变量放在shell环境中;之后我们可以通过echo $name来查看这个变量值;
当然,在用户的操作过程中,我们所使用的shell不一定只有我们看到的这一个shell终端(为了方便我们把这个shell叫做父shell),他同样可以有孩子,也就是子shell;这里就需要说到shell脚本;
一个shell脚本可以是这个样子:
这个是一个简单的shell脚本格式,声明了一个变量叫做__DEBUG他的值为20;我们在父shell中为这个脚本加上可执行权限,然后./执行这个脚本;如我们所愿屏幕上打印出来了__DEBUG的值20;之后我们在父shell中通过echo $__DEBUG再一次访问这个变量,但是奇怪的是,结果告诉我们这个变量在当前环境中是空;这里请不要感觉到很奇怪,也不要怀疑其他的什么;我想请你看一看这个脚本的第一行#!/bin/bash;
#!/bin/bash:用来告诉我要使用的是什么解析器;为什么要告诉我使用什么解析器呢?我自己不是有一个shell解析器吗?奇怪啊;
这里为什么要多此一举的添加上这个一句话呢?原因是使用./run.sh脚本时;shell解析器将会看看这个文件是不是可执行的,他是一个什么可执行文件,等一系列判断操作,这里也就说明了#!/bin/bash这句话是有用的;决定父shell将会使用一个什么样的shell来解析这个脚本;父shell判断完成之后,将会重新启一个进程执行bash run.sh这个脚本;重新启一个进程那么自然而然的可以说,这个创建的进程是父shell的子进程,从shell的角度来说也就是子shell;这个子进程(子shell)将会继承父shell的所有环境变量,同样子进程(子shell)中修改了一些东西,父shell是看不见的,毕竟两个进程的资源空间都不在一起嘛;
如果我上面那段话你不嫌我啰嗦,那么你应该已经明白我的意思了;这个脚本中所创建的变量是放在子shell环境中,而子shell声明周期是该脚本运行到该脚本结束;从始至终,子shell都没有办法影响到父shell的环境空间;所以在最后我们查看这个变量时,没有找到这个变量;原因就是这样;
如果我们想在脚本中把变量放在父shell环境中,而非重新创建一个shell环境空间;这里有一个独特的指令source;
在父shell中执行source run.sh,将会发现变量现在存到了父shell环境中;而非子shell了;
最后:至于想使用什么样的方式来用环境变量藏点东西,就要看实际使用情况了;写点东西,如有误笔,欢迎指出;