一.系统环境变量位置
在上章中,晓得了怎样更改系统环境变量,如PATH变量,以及创建自己的全局环境变量和局部环境变量。这篇学习如何让环境变量的作用持久化。在此之前linux查看桌面环境变量,先了解下系统环境变量文件会在什么位置,当使用bashshell时,bash是怎样查找环境变量位置的。下边先来介绍几个文件,这种文件叫启动文件或叫环境文件。
bash检测的启动文件(环境文件)取决于你启动bashshell的形式。启动bashshell有3种形式:
(1)登陆时的默认登陆shell。
(2)交互式shell。
(3)运行脚本的非交互式shell。
1.1登陆shell
登录shell是指:(1)用户登录时,输入用户名和密码后启动的shell(比如使用ssh登陆远程主机等);(2)通过带--login参数的命令:bash--login而启动的shell。当登陆linux系统时,bashshell作为登陆shell启动,登陆shell会从5个不同的启动文件里读取命令。包括:/etc/profile,$HOME/.bash_profile,$HOME/.bashrc,$HOME/.bash_login,$HOME/.profile。而/etc/profile文件是系统默认的bashshell的主启动文件。另外4个启动文件是针对用户的(不同发行版中,四个启动文件通常都只有一到二个),可依照个人需求定做。
(1)/etc/profile文件
只要登入了linux系统,bash才会执行/etc/profile启动文件中的命令(不同发行版的/etc/profile,有不同的设置和命令),profile文件内容如右图所示:
profile文件内容太长,截取了一段。上图有个for句子,它拿来循环读取/etc/profile.d目录下的所有文件。该文件目录包含以下文件,如右图所示:
上图启动文件中sh后缀的供bashshell使用,csh后缀的供cshell使用。lang.csh和lang.sh文件会尝试去判断系统上采用的默认语言字符集。对应LANG环境变量。
(2)$HOME目录下的启动文件
HOME目录下的隐藏文件,找到了$HOME/.bash_profile,$HOME/.bashrc。每位用户都可以编辑这种文件添加自己的环境变量,这此环境变量会在每次启动bashsehll会话时生效。HOME目录如右图所示:
.bash_profile启动文件会先去检测HOME目录下是不是有一个叫.bashrc的启动文件,假如有都会先执行上面的命令。bash_profile文件内容如右图所示:
上图中,可以看见在.bash_profile文件中给PATH变量添加了一个目录路径,并用exportPATH导出到全局中。在.bash_profile文件中加的变量可以持久化。
1.2交互式shell进程
交互式shell是指:就是在终端上执行,shell等待你的输入,但是立刻执行你递交的命令。命令行提示符输入命令,只会检测用户HOME目录中的.bashrc文件。该文件两个作用:1是查看/etc目录下通用的bashrc文件,2是为用户提供一个订制自己的命令别称(上面讲alias命令)和私有脚本函数(前面介绍)。.bashrc文件内容如右图所示:
1.3非交互式shell
非交互式shell是指:以shellscript(非交互)形式执行。在这些模式下,shell不与你进行交互linux版qq,而是读取储存在文件中的命令,但是执行它们。当它读到文件的结尾EOF,shell也就中止了。系统执行shell脚本时用的这是此类shell。区别是它没有命令提示符。但当你的系统上运行脚本时,显然希望才能运行一些特定启动的命令。
为了处理这些情况bashshell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,它会检测这个环境变量来查看要执行的启动文件。默认情况下并未设置该变量,使用printenv命令只返回提示符:
正如上图所示:BASH_ENV环境变量没有设置值。这些非交互式shell通常通过启动一个子shell来执行。假如父shell是登陆shell,这么可以从/etc/profile,/etc/profiled/*.sh和$HOME/.bashrc文件中继承这种变量。假如父shell中的变量是局部变量时,这么子shell未能承继。若果不启动子shell,变量已存在于当前shell中,即使不设置BASH_ENV,也可以使用当前的局部和全局变量。
交互式与非交互式两者区别:读取的配置文件不同,交互式bash必然读取~/.bashrc文件;非交互式bash读取的是环境变量BASH_ENV(一般情况下)所指定的配置文件。
二.环境变量持久化
里面了解了各类shell进程对应的环境文件,找出永久性环境变量就容易多了。可以借助那些文件来创建自己的永久性全局变量或局部变量。全局变量是对所有用户都须要使用的变量,可以将新的变量或更改过的变量设置置于/etc/profile文件中linux查看桌面环境变量,但升级了发行版该文件也会更新,所以这点要注意(对所有用户)。
最好是在/etc/profile.d目录中创建一个以.sh结尾的文件,把所有新的变量或更改过的变量全部置于此文件中(对所有用户)。
对于储存个人用户永久性bashshell变量的地方是$HOME/.bashrc文件。这一点适用于所有类型的shell进程(仅对当前用户)。
下边来演示给mysql工具包路径,添加到PATH全局变量中:
(1)在虚拟根目录下输入mysqldump工具,提示未找到命令,如右图所示:
(2)找到mysqldump工具包的位置,路径是/usr/local/mysql/bin。如右图所示:
(3)查看现有PATH的路径列表,以逗号分隔的默认有5个路径。如右图所示:
(4)在$HOME/.bash_profile文件中加入一个PATH全局变量值,路径为/usr/local/mysql/bin。如右图所示:
(5)exit退出终端或shutdown后重新开机,在虚拟根目录下输入mysqldump工具LINUX社区,PATH设置的mysql工具包路径永久生效。如右图所示:
再切换到mysql用户下,PATH的设置也是生效的,说明是跨用户生效的。
在root用户下,使用子shell,PATH的设置也是生效的,说明跨进程,已设置成了全局变量。
(6)最后在看下PATH路径,/usr/local/mysql/bin已添加了